0

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

COL_1       COL_2     COL_3     COL_4  COL_5
-----       -----     -----     -----   ----
1            A         X         Y
1            *         *         *
.............
.......

COL_2、COL_3 和 COL_4 可以具有特定值或“*”表示全部。

如果找到包含所有特定值的行,我只需要选择一行。

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'

如果我对值使用“或”,我会得到两行。请帮忙。

4

2 回答 2

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'
)            

如果它比这更复杂,那么这种技术将很快变得丑陋。

于 2013-10-23T14:09:04.113 回答
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

这将检索所有匹配或具有匹配或星号的任意组合的记录,但根据找到的真实匹配与星号的数量对它们进行优先级排序(在这种情况下,数字越大匹配越好)。

于 2013-10-23T14:14:09.983 回答