如何在sql server中将case语句与左连接结合起来?

Posted

技术标签:

【中文标题】如何在sql server中将case语句与左连接结合起来?【英文标题】:How to combine case statement with left join in sql server? 【发布时间】: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, ...) 等情况。有没有人解释一下?

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于如何在sql server中将case语句与左连接结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同条件的sql server的case语句中插入多个else?

如何在 SQL Server 的 Where 子句中使用 case 语句

SQL Server 2012:如何在 @Var 前后使用文字在 Case 语句中显示 @Var 结果

如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间

sql 各种连接的使用条件,

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]