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