如何忽略SQL Server中连接字段的非数字值?

时间:2014-08-18 18:19:46

标签: sql-server inner-join

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错误,因为它不是数字。

1 个答案:

答案 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