带有条件 CASE 语句的 SQL LEFT JOIN

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,但并非总是如此......我是否遗漏了什么会导致这种行为?

sha*_*t00 3

哪个条件导致连接中的行匹配并不重要。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)