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
运算符,因为它会返回更多数据。
答案 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)