sql join中的SubString和CharIndex

时间:2014-01-31 09:24:34

标签: sql-server tsql sql-server-2008-r2

DECLARE @TABLE_A TABLE  (ID INT,NAME_A VARCHAR(100),VAL INT)
INSERT INTO @TABLE_A VALUES(1,'1-06-734-01791/01',900),(2,'NAME2/2/F',100),(3,'NAME3/3',400),(4,'NAME44',80)

DECLARE @TABLE_B TABLE (ID INT,NAME_B VARCHAR(100))
INSERT INTO @TABLE_B VALUES(1,'1-06-734-01791'),(2,'NAME2'),(3,'NAME3'),(4,'NAME4')

SELECT A.ID,b.NAME_b,A.VAL FROM @TABLE_A AS A
     INNER JOIN @TABLE_B AS B 
   ON B.NAME_B=SUBSTRING( A.NAME_A,1,CHARINDEX('/',A.NAME_A,1)-1)  

这会出现以下错误:

  

传递给LEFT或SUBSTRING函数的长度参数无效。

join部分,我不想要like运算符,因为它会返回更多数据。

2 个答案:

答案 0 :(得分:4)

发生错误是因为您的连接条件对没有斜杠的名称不健壮;当您在示例数据中将NAME44替换为NAME4/4时,您会发现没有错误。

首先检查CHARINDEX是否返回零(这意味着没有找到斜杠),可以使代码更加健壮:

INNER JOIN @TABLE_B AS B
  ON B.NAME_B = CASE WHEN CHARINDEX('/', A.NAME_A, 1) = 0
                     THEN A.NAME_A
                     ELSE SUBSTRING(A.NAME_A, 1, CHARINDEX('/', A.NAME_A, 1) - 1)
                END

答案 1 :(得分:2)

从示例数据中,您似乎正在使用表B,而应使用表A.只需在JOIN中切换它们就可以了。

尝试:

DECLARE @TABLE_A TABLE  (ID INT,NAME_A VARCHAR(100),VAL INT)
INSERT INTO @TABLE_A VALUES(1,'NAME1/1/M/L',900),(2,'NAME2/2/F',100),(3,'NAME3/3',400),(4,'NAME4/4',80)

DECLARE @TABLE_B TABLE (ID INT,NAME_B VARCHAR(100))
INSERT INTO @TABLE_B VALUES(1,'NAME1'),(2,'NAME2'),(3,'NAME3'),(4,'NAME4')

SELECT A.ID,A.NAME_A,A.VAL FROM @TABLE_A AS A
     INNER JOIN @TABLE_B AS B 
   ON B.NAME_B=SUBSTRING( A.NAME_A,1,CHARINDEX('/',A.NAME_A,1)-1)