如何在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 结果