微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在连接条件下使用 Len() 运行 SQL 查询

我正在尝试运行 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 举报,一经查实,本站将立刻删除。