我有一个包含三列的表,让我们定义它并用样本数据填充它:
A | B | C |
------ | ----- | ------|
A1 | NA | NA |
A1 | B1 | NA |
NA | B1 | NA |
NA | B1 | C1 |
NA | NA | C1 |
我们可以看到组合(A,B,C)是独一无二的。我需要一个选择,它将使用参数选择确切的一行:A:B:C。例如:
1)如果我有:A = A1,:B = SOME_B,:C = SOME_C。它应该选择第一行,因为列A具有完全匹配,而列B和C不适用。
2)如果我有:A = SOME_A,:B = SOME_B,:C = SOME_C。它不应该返回任何东西。
首先尝试是:
SELECT *
FROM SAMPLE_TABLE
WHERE (A = :A OR A = 'NA') AND (B = :B OR B = 'NA') AND (C = :C OR C = 'NA');
这前两行返回。错了,正如预期的那样。那不是我想要的。
第二次尝试:
SELECT *
FROM SAMPLE_TABLE
WHERE (A = :A OR (A = 'NA' AND NOT EXISTS(SELECT 1 FROM SAMPLE_TABLE WHERE A = :A AND (B = :B OR B = 'NA') (C = :C OR C = 'NA')) AND (B = :B OR B = 'NA') AND (C = :C OR C = 'NA');
它的工作原理和逻辑是正确的,但对于B和C,我需要做同样的事情。之后,我需要为A列修改NOT EXISTS,其中应包括B和C的NOT EXISTS,对于A列也应该包括NOT EXISTS,依此类推。我得到一个循环。
任何想法我们如何编写简单的SQL来解决这样的问题?或者我只是想念一些愚蠢的事情?
修改
哦,这是我的错,不能说清楚。让我们看看业务示例(表 TEAM_MATRIX ):
COUNTRY|PRIORIT| TEAM |
------ | ----- | ------|
NA | NA | GLOB_T|
UK | LOW | UK_T1 |
UK | MED | UK_T2 |
UK | HIGH | UK_T3 |
US | NA | US_T |
US | LOW | US_T1 |
Coulmns国家/地区和优先级可以视为输入参数。列组应被视为输出。几个例子:
1)假设我们有参数:country = FR,priority = LOW。然后输出团队应该是GLOB_T,因为没有这样的组合FR和LOW。 (NA意味着我们不在乎)。
2)如果国家/地区是US且优先级为LOW =>输出团队应该是US_T1,因为我们有US和LOW组合。
3)如果国家/地区为US且优先级为MED =>输出团队应该是US_T,因为我们有US和NA的组合(NA意味着我们不关心)。
有没有办法让SQL遵循这个逻辑?
SELECT TEAM
FROM TEAM_MATRIX
WHERE (COUNTRY = ?1 OR COUNTRY = 'NA') AND (PRIORIT = ?2 OR PRIORIT = 'NA');
这里?1 - 国家参数,?2 - 优先级参数。这不起作用,例如将始终选择组合((NA,NA) - > GLOB_T)。
谢谢!