我的桌子看起来像这样:
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语句的第一个匹配项,而不是所有匹配项。该案例陈述的顺序已经反映了我上面的业务逻辑。
有任何想法吗?
我担心解决方案非常简单,但现在看不到。
看来您可以执行以下操作:
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非常相似的方法。
apply