如何在sql server中结合case语句和left join?

时间:2014-08-25 16:29:28

标签: sql-server join

我有两张桌子,我必须有条件地加入他们。表的定义是 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,...)之类的情况。任何人都有一些亮点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在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))

答案 2 :(得分:0)

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

声明@ table_01表(
[column_01] [数据类型为sysname]
);
声明@ table_02表(
[column_01] [数据类型为sysname]
); 与
[助洗剂]
如(选择[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]
从[助洗剂];