Ori*_*yer 6 sql t-sql sql-server join case
希望这是一个快速
SELECT *
FROM T
left JOIN J ON
CASE
WHEN condition1 THEN 1 --prefer this option even if CASE2 has a value
WHEN condition2 THEN 2
ELSE 0
END = 1 (edit: but if 1 does not satisfy, then join on 2)
Run Code Online (Sandbox Code Playgroud)
两种情况都返回结果,但我希望 THEN 1 取代 THEN 2 并成为查找优先级
我可以让 SQL 做一些类似 join on 的事情max(CASE)吗?
基本上我试图从 Excel 复制嵌套的 INDEX/MATCH
编辑:我听到的是,案例应该在第一个返回的 TRUE 处停止,但是当我测试时它不会表现得那样
SELECT *
FROM T
left JOIN J ON
CASE
WHEN condition1 THEN 1 --prefer this option even if CASE2 has a value
WHEN condition2 THEN 1
ELSE 0
END = 1
Run Code Online (Sandbox Code Playgroud)
有时似乎更喜欢 2nd THEN 1,但并非总是如此......我是否遗漏了什么会导致这种行为?
哪个条件导致连接中的行匹配并不重要。case在连接中使用表达式有正当理由,但我认为您只需要or您的条件,然后使用case表达式输出匹配的排名原因。
SELECT *, CASE WHEN <condition1> THEN 1 WHEN <condition2> THEN 2 END as match_code
FROM T LEFT OUTER JOIN J ON <condition1> or <condition2>
Run Code Online (Sandbox Code Playgroud)
我不知道如何描述 Excel 中的“嵌套索引/匹配”。如果我在上面走错了路,那么也许您正在寻找嵌套的 case 表达式?
现在,如果您的条件将在不同行中匹配,而您只想保留一个,那么......
WITH matches AS (
SELECT *, CASE WHEN <condition1> THEN 1 WHEN <condition2> THEN 2 END AS match_code
FROM T LEFT OUTER JOIN J ON <condition1> OR <condition2>
), ranked as (
SELECT *, MIN(match_code) OVER (PARTITION BY ???) AS keeper
FROM matches
)
SELECT ...
FROM ranked
WHERE match_code = keeper
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24343 次 |
| 最近记录: |