SQL拼接字符串使⽤IN查询⽅法
问题描述
当在 SQL SERVER 中查询的时候,同事遇到⼀个字段存储的字符串为⽤逗号分隔的主键 ID 值,格式为:1,2,3,4,这时候需要查询符合条件的所有数据,所以选择使⽤ IN 查询,但是直接执⾏会提⽰错误:在将 varchar 值 '1,2,3,4' 转换成数据类型 int 时失败。于是咨询我怎么解决呢?
我看了下错误信息,很明显是因为 IN 的字段是⼀个 Int 类型,强制把 varchar '1,2,3,4' 转换成 Int 语法是不允许的,所以查询失败。如下解决思路告诉我了同事。
解决思路
如果要使⽤ IN 就必须把当前字符串 “列的形式” 转换成 “⾏的形式” 语法上才⾏,也就是说把 '1,2,3,4' 的字符串转换成⼀个只有⼀列的表才⾏,表中有4⾏数据分别存储1,2,3,4,这时候就可以正确使⽤ IN 关键字来了。那如何解决就不报错还能查询数据呢?解决利器是 SQL SERVER 中表值函数(可以理解是⼀个有 TABLE 返回值的⽅法)
在 SQL 中位置在数据库名称 --> 可编程性 --> 表值函数
告诉同事按照这个思路试着写下,我随后也写了⼀个通⽤的表值函数给他,废话不多说,直接上关键代码。
关键代码
CREATE FUNCTION [dbo].[F_SUBSTRINGINTARRAY]
(
@STR VARCHAR(1000), --字符串队列格式为:1,2,3,4
@CHAR VARCHAR(10)  --截取字符串的符号:,
)
RETURNS @RESULT TABLE(ID INT)
AS
BEGIN
DECLARE @INDEX INT  --声明截取符号的位置
DECLARE @ORDERID INT --声明获取的INT编号
--判断传递的字符串不能为空
IF LEN(@STR) > 0
BEGIN
--查询第⼀个符号,的位置
SET @INDEX = CHARINDEX(@CHAR, @STR)
--循环截取字符串
WHILE @INDEX > 0
BEGIN
--截取第⼀个,位置的值
SET @ORDERID = SUBSTRING(@STR, 1, @INDEX - 1)
--截取@STR字符串第⼀个值,截取后变成2,3,4
SET @STR = SUBSTRING(@STR, @INDEX + 1, LEN(@STR) - @INDEX)
--重新给@INDEX赋值
SET @INDEX = CHARINDEX(@CHAR, @STR)
--插⼊到返回的表格中
INSERT INTO @RESULT(ID) VALUES(@ORDERID)
END
--判断是否截取到最后⼀个
IF @INDEX = 0 AND LEN(@STR) > 0
BEGIN
--插⼊到返回的表格中
INSERT INTO @RESULT(ID) VALUES(@STR)
END
END
RETURN
END
/*
测试当前的函数sql server拼接字符串函数
--第⼀种情况
SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1,2,3', ',')
--第⼆种情况
SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1', ',')
*/
GO
完美解决问题!我很开⼼能帮到他,同时也得到了⼀个⼤⼤的
由于编程能⼒有限,只考虑到⽬前⼏种情况,如有问题请指正,谢谢了~
总结
当遇到 SQL 语句问题时,先分析错误原因,然后思考如何解决的思路,根据思路编写 SQL 语句,最后通过不断测试来强化函数,变成通⽤函数,下次遇到这个问题可以直接调⽤。
如需转载请注明出处,谢谢了!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。