SQL中查询中的条件SELECT

时间:2013-10-23 14:05:47

标签: sql

我有一个包含以下行的表格,我需要在复杂查询中加入

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',我会得到两行。 请帮助。

2 个答案:

答案 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

这将检索匹配或具有任何匹配或星号组合的所有记录,但会根据找到的实际匹配数与星号的优先级排列(在这种情况下,较高的数字是更好的匹配)。