如何解决在连接条件下使用 Len() 运行 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',('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
我必须更改什么才能成功执行查询?
解决方法
我不知道你为什么首先要尝试转换为 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,REVERSE(sl.oli) + '-')) = sp.onum
GROUP BY sl.oli
+------------+----+
| oli | qs |
+------------+----+
| Sample-CCC | 11 |
| Sample-XYZ | 22 |
| Test-ABC | 10 |
+------------+----+
,
这个条件的左半部分是一个整数:
ON len(sl.oli) - charindex('-',reverse(sl.oli) + '-') = sp.onum
因为 LEN 和 CHARINDEX 函数都返回整数值。如果这是您要查找的内容(匹配存储在 varchar 中的数字的任何 sp.onum 值),您可以将该 int 转换为 varchar:
ON cast((len(sl.oli) - charindex('-',reverse(sl.oli) + '-')) as varchar(50)) = sp.onum
但如果 sp.onum 实际上是一个字符串,我猜您是在尝试从 sl.oli 获取子字符串,但这不是您的代码所做的。您需要添加 SUBSTRING function 并调整您的参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。