运行 SQL 在连接条件中使用 Len() 查询

Run SQL Query With Len() In Join Condition

我正在尝试 运行 sql 查询,但出现错误

Conversion failed when converting the varchar value 'Sample-XYZ' to data type int

我不确定为什么查询试图转换为 int,因为它应该是 varchar

这是示例 DDL

Create Table Sample ( oli varchar(100), qs int )
Create Table Sample1 ( onum varchar(100), sd datetime2 )

Insert Into Sample (oli, qs) Values
('Sample-XYZ-3', 22), ('Sample-CCC-1', 11), ('Test-ABC-34', 10)

Insert Into Sample1 (onum, sd) Values
('Sample-XYZ', '2020-04-03 14:17:33.8530000'), 
('Sample-CCC', '2020-04-03 14:17:33.8530000'),
('Test-ABC', '2020-04-03 14:17:33.8530000');

Select
CAST(left(oli, len(oli) - charindex('-', reverse(oli) + '-')) As INT) As oli
,SUM(COALESCE(qs,0)) As qs
FROM Sample sl
INNER JOIN Sample1 sp
ON len(sl.oli) - charindex('-', reverse(sl.oli) + '-') = sp.onum
GROUP BY sl.oli

我必须更改什么才能成功执行查询?

这个条件的左半部分给出了一个整数:

ON len(sl.oli) - charindex('-', reverse(sl.oli) + '-') = sp.onum

因为 LEN 和 CHARINDEX 函数都是 return 整数值。如果那是您要查找的内容(以匹配任何 sp.onum 存储在 varchar 中的数字值),您可以将该 int 转换为 varchar:

ON cast((len(sl.oli) - charindex('-', reverse(sl.oli) + '-')) as varchar(50)) = sp.onum

但是如果 sp.onum 实际上是一个字符串,我猜您正试图从 sl.oli 中获取一个子字符串,但这不是您的代码所做的。您需要添加 SUBSTRING function 并调整参数。

我不知道你为什么首先要尝试转换为 int,也许你现实生活中的问题比这更令人困惑。但是删除演员表很有效:

SELECT      LEFT(sl.oli, LEN(sl.oli) - CHARINDEX('-', REVERSE(sl.oli) + '-')) AS oli
,           SUM(COALESCE(sl.qs, 0)) AS qs
FROM        Sample sl
INNER JOIN  Sample1 sp
            ON LEFT(sl.oli, LEN(sl.oli) - CHARINDEX('-', REVERSE(sl.oli) + '-')) = sp.onum
GROUP BY    sl.oli


+------------+----+
|    oli     | qs |
+------------+----+
| Sample-CCC | 11 |
| Sample-XYZ | 22 |
| Test-ABC   | 10 |
+------------+----+