我有一个包含以下行的表格,我需要在复杂查询中加入
COL_1 COL_2 COL_3 COL_4 COL_5
----- ----- ----- ----- ----
1 A X Y
1 * * *
.............
.......
COL_2,COL_3和COL_4可以具有特定值,或者'*'表示ALL。
如果找到包含所有特定值的行,我只需要选择一行。
COL_2 ='A' and COL_3 = 'X' and COL_4 = 'Y' AND COL_1 = '1'
如果找不到这样的行,则应选择具有以下条件的行。
COL_2 ='*' and COL_3 = '*' and COL_4 = '*' AND COL_1 = '1'
如果我对值使用'OR',我会得到两行。 请帮助。
答案 0 :(得分:0)
根据您的情况有多复杂,您可以检查行的存在:
where col2='A' and col3='X' and col4='Y' and col1='1'
or
(
not exists (select 1 from tbl where col2='A' and col3='X' and col4='Y' and col1='1')
and col2='*' and col3='*' and col4='*' and col1='1'
)
如果它比这更复杂,这种技术会变得很难看。
答案 1 :(得分:0)
同样,根据这在现实生活中的复杂程度,这样的事情可能有效:
select top 1 col2, col3, col4, col1 from
(
select 1 [priority], col2, col3, col4, col1
from tbl
where col2='A' and col3='X' and col4='Y' and col1='1'
union
select 2 [priority], col2, col3, col4, col1
from tbl
where col2='*' and col3='*' and col4='*' and col1='1'
) x
order by x.priority
这将检索两种可能的情况,但按给定的优先级排序(最好的是在顶部),然后选择前1条记录。
这项技术可以进化,以便您可以做更复杂的事情。例如,您可以根据实际匹配的列数与星数的数量来计算优先级,而不是固定的priority
值。也许可以从以下内容开始:
select top 1 case when col2='A' then 100 when col2='*' then 1 else 0 end
+ case when col3='X' then 100 when col2='*' then 1 else 0 end
...etc... [priority]
from tbl
where col2 in ('A','*') and col3 in ('X','*') ...etc...
order by priority desc
这将检索匹配或具有任何匹配或星号组合的所有记录,但会根据找到的实际匹配数与星号的优先级排列(在这种情况下,较高的数字是更好的匹配)。