一种可能性是使用virtual columns
:
CREATE TABLE country_parms
(country VARCHAR2(50 CHAR),
product VARCHAR2(50 CHAR),
param1 VARCHAR2(50 CHAR),
param2 VARCHAR2(50 CHAR),
param3 VARCHAR2(50 CHAR),
country_nn VARCHAR2(50 CHAR) GENERATED ALWAYS AS (NVL("COUNTRY",'-')) ,
product_nn VARCHAR2(50 CHAR) GENERATED ALWAYS AS (NVL("PRODUCT",'-')) ,
PRIMARY KEY (country_nn, product_nn)
)
使用这种方法,您还可以对您的country
和product
表使用 fk-constraints。要选择值,请使用如下视图:
SELECT c.country
, p.product
, CASE WHEN cp1.country_nn IS NOT NULL THEN cp1.param1
WHEN cp2.country_nn IS NOT NULL THEN cp2.param1
WHEN cp3.country_nn IS NOT NULL THEN cp3.param1
ELSE cp4.param1
END param1
, CASE WHEN cp1.country_nn IS NOT NULL THEN cp1.param2
WHEN cp2.country_nn IS NOT NULL THEN cp2.param2
WHEN cp3.country_nn IS NOT NULL THEN cp3.param2
ELSE cp4.param2
END param2
, CASE WHEN cp1.country_nn IS NOT NULL THEN cp1.param3
WHEN cp2.country_nn IS NOT NULL THEN cp2.param3
WHEN cp3.country_nn IS NOT NULL THEN cp3.param3
ELSE cp4.param3
END param3
FROM country c
CROSS JOIN product p
LEFT JOIN country_parms cp1
ON cp1.country_nn = c.country
AND cp1.product_nn = p.product
LEFT JOIN country_parms cp2
ON cp2.country_nn = c.country
AND cp2.product_nn = '-'
LEFT JOIN country_parms cp3
ON cp3.country_nn = '-'
AND cp3.product_nn = p.product
LEFT JOIN country_parms cp4
ON cp4.country_nn = '-'
AND cp4.product_nn = '-'
使用所有国家和产品的叉积,然后首先寻找精确匹配,然后是产品为空的地方,然后是国家/地区为空的地方,最后都是空的地方以获得参数的配置。
甚至更简单:
SELECT MAX(param1) KEEP (DENSE_RANK FIRST ORDER BY country nulls last
, product nulls last) param1
, MAX(param2) KEEP (DENSE_RANK FIRST ORDER BY country nulls last
, product nulls last) param2
, MAX(param3) KEEP (DENSE_RANK FIRST ORDER BY country nulls last
, product nulls last) param3
FROM country_parms
WHERE country_nn IN (:country_nn, '-')
AND product_nn IN (:product_nn, '-')