小编典典

SQL Server:获取第一个联接值

sql

我的桌子看起来像这样:

ID  DEFINITION  VALUE
----------------------
1   A|B|C       1
2   A|All|All   3
3   A|B|All     6
4   All|B|All   4

该表后面的业务逻辑是,在传递字符串时,应检索3个值中最具体的DEFINITION。“全部”可以解释为“%”。

例如,如果我的定义为’X | B | Z’->值应为4。如果我具有’A | B | C’->值应为1(而不是1,3,6,4)
-仅应从右侧开始检索最具体的结果。

“ |” 只是一个分隔符,每个子字符串可以是任何东西。在此示例中,我选择了AC。不幸的是,所有内容都串联在一列中。

我目前正在编写此查询,但不幸的是,它的结果是所有匹配项:

SELECT *
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
              AND (T2.DEFINITION = CASE 
                                      WHEN T2.DEFINITION = 'A|B|C'
                                         THEN T2.DEFINITION
                                      WHEN T2.DEFINITION = 'A|ALL|C'
                                         THEN T2.DEFINITION
                                      WHEN T2.DEFINITION = 'ALL|B|C'
                                         THEN T2.DEFINITION
                                      WHEN T2.DEFINITION = 'ALL|ALL|C'
                                         THEN T2.DEFINITION
                                      WHEN T2.DEFINITION = 'A|B|ALL'
                                         THEN T2.DEFINITION....
                                      ELSE 'All|All|All'
                                   END)

我想检索case语句的第一个匹配项,而不是所有匹配项。该案例陈述的顺序已经反映了我上面的业务逻辑。

有任何想法吗?

我担心解决方案非常简单,但现在看不到。


阅读 233

收藏
2021-04-22

共1个答案

小编典典

看来您可以执行以下操作:

select top (1) t.*
from t
where @str like replace(t.definition, 'All', '%')
order by (case when t.definition like '%All%All%All%' then 3
               when t.definition like '%All%All%' then 2
               when t.definition like '%All%' then 1
               else 0
          end) desc;

如果要对列中的值执行此操作,则可以使用apply非常相似的方法。

2021-04-22