运行 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 |
+------------+----+
我正在尝试 运行 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 |
+------------+----+