如何有条件地操作列并加入该列?

时间:2019-09-06 18:40:43

标签: sql sql-server sql-server-2008

我需要在一个列上联接表,该列需要根据另一列的条件进行操作。

表1

Make SerialNumber Client
AA   0123          1
AA   0124          1
KK   J642          1
ZZ   0444          2

table2

SerialNumber Color
123           Red
124           Green
J642          Green
0444          Yellow

我对SQL还是很陌生,过去我做过类似

Select * RIGHT(RTRIM(SerialNumber),LEN(SerialNumber)-1) from Table1 where Make = 'AA'

但是现在我需要更多的参与。

我需要能够基于SerialNumber加入两个表。基本上,我需要使table1 SerialNumber看起来像table2 SerialNumber并将它们全部合并到一个SQL语句中。我没有编辑表格或创建新表格的能力。如果第一个表中的make是AA,则需要删除第一个字符,在我的情况下,该字符始终为零。

目标是拥有这个

Make  SerialNumber  Client  Color
AA    123           1       Red
AA    124           1       Green
KK    J642          1       Green
ZZ    0444          2       Yellow

2 个答案:

答案 0 :(得分:1)

使用UNION处理Make的两种情况:

SELECT m.Make,m.SerialNumber,m.Client,c.Color
FROM table1 m
INNER JOIN table2 c
ON m.SerialNumber=c.SerialNumber
WHERE m.Make<>'AA'
UNION ALL
SELECT m.Make,c.SerialNumber,m.Client,c.Color
FROM table1 m
INNER JOIN table2 c
ON RIGHT(m.SerialNumber,LEN(m.SerialNumber) - 1)=c.SerialNumber
WHERE m.Make='AA'

答案 1 :(得分:0)

使用SUBSTRINGPATINDEX删除0子句中的前ON

select 
  t1.make, t2.serialnumber, t1.client, t2.color
from table1 t1 inner join table2 t2
on 
case 
  when isnumeric(t1.serialnumber) = 1 
    then substring(t1.serialnumber, patindex('%[^0]%', t1.serialnumber), len(t1.serialnumber)) 
  else t1.serialnumber  
end =
case 
  when isnumeric(t2.serialnumber) = 1 
    then substring(t2.serialnumber, patindex('%[^0]%', t2.serialnumber), len(t2.serialnumber)) 
  else t2.serialnumber  
end

请参见demo
结果:

make | serialnumber | client | color 
:--- | :----------- | -----: | :-----
AA   | 123          |      1 | Red   
AA   | 124          |      1 | Green 
KK   | J642         |      1 | Green 
ZZ   | 0444         |      2 | Yellow