【问题标题】:How to combine case statement with left join in sql server?如何在sql server中将case语句与左连接结合起来?
【发布时间】:2014-08-25 16:29:28
【问题描述】:

我有两张表,我必须有条件地离开它们。表的定义是 tbl1 (col1, col2, col3, ..., coln), tbl2 (col1, col2, col3), 两个表中的 col1 定义为 char(2),col2 定义为 char(4)。例如 tbl1:

col1    col2    col3    …    coln
01      0010
02      0014
10      1235
29      2566
38      1235
8A      1232

tbl2:(x 表示它是一个字母,可以是 0-9 或 a-z 之间的任何值)

col1    col2    col3
0x       NULL
1x       NULL
2x       NULL
...
9x       NULL
13       1234
31       1890
32       1342
3a       1232
...

我需要根据 tbl2 中 col1 和 col2 的值加入这两个表。以下是我的查询

select * 
from tbl1 left join tbl2
on case when tbl2.col1 like '[0-9]x' then left(tbl1.col1, 1)=left(tbl2.col1, 1)
else tbl1.col1=tbl2.col1 and tbl1.col2=isnull(tbl2.col2, tbl1.col2) end

我收到一个错误“'=' 附近的语法不正确”。谁能告诉我为什么?此外,我还想考虑 (3a, 13xx, ...) 、 (3a, 123x, ...) 或 (3a, 1xxx, ...) 等情况。有没有人解释一下?

【问题讨论】:

    标签: sql-server join


    【解决方案1】:

    case 语句求值为一个值,而on 子句需要a condition

    您可以通过将值与1 进行比较来将其转换为条件,例如:

    case 
    when tbl2.col1 like '[0-9]x' and left(tbl1.col1, 1) = left(tbl2.col1, 1) then 1
    when tbl1.col1 = tbl2.col1 and tbl1.col2 = isnull(tbl2.col2, tbl1.col2) then 1
    end = 1
    

    【讨论】:

    • 如果对语句和表达式的区别很迂腐,t-sql 中的 CASE 是一个表达式,而不是一个语句。
    • @SeanLange:你说得对,每个 MSDN 的正确术语似乎是“条件”。
    【解决方案2】:

    除了CASE 语句,您可以只使用OR 的多组条件:

    select * 
    from tbl1 
    left join tbl2
    on   (tbl2.col1 like '[0-9]x' AND left(tbl1.col1, 1) = left(tbl2.col1, 1))
      OR (tbl1.col1=tbl2.col1 AND tbl1.col2 = isnull(tbl2.col2, tbl1.col2))
    

    【讨论】:

      【解决方案3】:

      您可以使用 cte 来构建结果,如下所示:

      声明@table_01 表(
        [column_01] [系统名]
        );
      声明@table_02 表(
        [column_01] [系统名]
        );
      与[建造者]
           作为(选择 [table_02].[column_01]
              来自   @table_01 作为 [table_01]
                      以 [table_02] 身份加入@table_02
                      在左侧([table_01].[column_01], 1) = 左侧([table_02].[column_01], 1)
               在哪里  [table_02].[column_01] 喜欢 '[0-9]x'
               工会
              选择 [table_02].[column_01]
              来自   @table_01 作为 [table_01]
                      以 [table_02] 身份加入@table_02
                       在 [table_01].[column_01] = [table_02].[column_01]
               其中  [table_01].[column_01] = = isnull([table_02].[column_01], [table_01].[column_01]))
      选择 [column_01]
      来自   [builder];

      【讨论】:

        猜你喜欢
        • 2015-05-18
        • 2022-12-06
        • 1970-01-01
        • 2020-09-09
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多