SELECT * from table1 as t1
INNER JOIN table2 as t2 ON t1.id = t2.id
INNER JOIN table3 as t3 ON
CASE WHEN CHARINDEX(':', t3.reference_number, 3) > 3
THEN SUBSTRING(t3.reference_number, 3, CHARINDEX(':', t3.reference_number, 3) -3 )
ELSE RIGHT(t3.reference_number, LEN(t3.reference_number) -2) end = Cast(t2.PurchaseOrderID as int)
我有一个像上面这样的查询,我想在一个表上加入我想要加入的值是字段本身的子字符串。该字段包含非数字值但我不想在该字段上进行内部联接(如果是这种情况。)
我该怎么做?
* t3.reference_number是格式为O的字段:######当我想要内连接时,可以是任何其他时间的任何文本。我知道这是一个糟糕的数据库设计,但它是我现在无法改变的遗留系统/数据库。
例如:
t3.reference_number =" O:345215"其中345215是我要加入的另一个表的外键
但如果t3.reference_number ="你好"然后我不想加入因为它无法将子字符串转换为int而导致sql错误,因为它不是数字。
答案 0 :(得分:1)
在这里,您将整个CASE
放入ISNUMERIC()
函数并预先发布。
declare @table1 table (reference_number varchar(25))
declare @table2 table (PurchaseOrderID int)
insert into @table1 (reference_number)
select 'O:345215' union
select 'hello'
insert into @table2
select '345215'
select *
from @table1 t1
join @table2 t2
on CASE WHEN CHARINDEX(':', t1.reference_number, 3) > 3
THEN SUBSTRING(t1.reference_number, 3, CHARINDEX(':', t1.reference_number, 3) -3 )
ELSE RIGHT(t1.reference_number, LEN(t1.reference_number) -2) end = Cast(t2.PurchaseOrderID as int)
and ISNUMERIC(CASE WHEN CHARINDEX(':', t1.reference_number, 3) > 3
THEN SUBSTRING(t1.reference_number, 3, CHARINDEX(':', t1.reference_number, 3) -3 )
ELSE RIGHT(t1.reference_number, LEN(t1.reference_number) -2) end) = 1