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(), --字符串队列格式为:,,,
@CHAR VARCHAR() --截取字符串的符号:,
)
RETURNS @RESULT TABLE(ID INT)
AS
BEGIN DECLARE @INDEX INT --声明截取符号的位置
DECLARE @ORDERID INT --声明获取的INT编号 --判断传递的字符串不能为空
IF LEN(@STR) >
BEGIN
--查询第一个符号,的位置
SET @INDEX = CHARINDEX(@CHAR, @STR)
--循环截取字符串
WHILE @INDEX >
BEGIN
--截取第一个,位置的值
SET @ORDERID = SUBSTRING(@STR, , @INDEX - )
--截取@STR字符串第一个值,截取后变成 ,,
SET @STR = SUBSTRING(@STR, @INDEX + , LEN(@STR) - @INDEX)
--重新给@INDEX赋值
SET @INDEX = CHARINDEX(@CHAR, @STR)
--插入到返回的表格中
INSERT INTO @RESULT(ID) VALUES(@ORDERID)
END
--判断是否截取到最后一个
IF @INDEX = AND LEN(@STR) >
BEGIN
--插入到返回的表格中
INSERT INTO @RESULT(ID) VALUES(@STR)
END
END
RETURN
END
/*
测试当前的函数
--第一种情况
SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1,2,3', ',')
--第二种情况
SELECT * FROM [DBO].[F_SUBSTRINGINTARRAY]('1', ',')
*/
GO
完美解决问题!我很开心能帮到他,同时也得到了一个大大的
SQL 拼接字符串 使用IN查询方法的更多相关文章
- Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
Different ways to concatenate two strings in Golang - GeeksforGeeks https://www.geeksforgeeks.org/di ...
- python3 拼接字符串的7种方法
1.直接通过(+)操作符拼接 1 2 >>> 'Hello' + ' ' + 'World' + '!' 'Hello World!' 使用这种方式进行字符串连接的操作效率低下,因为 ...
- sql 拼接字符串单条拆分多条
SELECT * FROM ( SELECT A.WS_ID , B.NEXT_OPERATOR FROM ( SELECT WS_ID , [NEXT_OPERATOR] = CONVERT(XML ...
- SQL拼接字符串时单引号转义问题 单引号转义字符
要拼接一个单引号到已有字符串前后, 开始以为(错误)可以用 \ 转义,如下: '\''+ str+'\'' 看颜色就知道是不行的. 正确方法是两个单引号就转义为单引号,如下: ''''+str+'' ...
- 【SQL】字符串去空格解决方法
一.表中字符串带空格的原因 1,空格就是空格. 2,控制符 显示为 空格. 二.解决方法 第一种情况,去空格的处理的比较简单,Replace(column,' ','') 就可以解决. 第二种情况,解 ...
- Python拼接字符串的7种方法
1.直接通过+操作: s = 'Python'+','+'你好'+'!'print(s) 打印结果: Python,你好! 2.通过join()方法拼接: 将列表转换成字符串 strlist=['Py ...
- oracle--合并行数据(拼接字符串),获取查询数据的前3条数据...
--标准函数Lpad 可以实现左补零,但是如果多于需要长度,则会截断字符串 SELECT LPAD ('1' , 3 , '0') FROM DUAL -- return 001 情况一:需要补零. ...
- sql拼接字符串和转换类型
select top 10 a.ID as a_ID,a.Name as a_Name,c.* from (select * from DC_Trees where Pid=187 or ID=187 ...
- sql拼接字符串
update boc_loan_apply set birthday=concat(birthday,'-01');
随机推荐
- .Net利用cwbx.dll call AS400 program得到数据
calling as400 programs from c# http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+ H ...
- 洛谷【P2257】 YY的GCD
出处:http://www.cnblogs.com/peng-ym/p/8652288.html ( 直接去出处那看就好了 ) 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求 ...
- 路由器配置——OSPF协议(1)
一.实验目的:用OSPF协议使全网互通 二.拓扑图 三.具体步骤配置 (1)R1路由器配置 Router>enableRouter#configure terminalEnter configu ...
- 在一个非默认的位置包含头文件stdafx.h
如果stdafx.h和你当前的工程不在一个文件夹下,当你在代码中第一行写下#include "stdafx.h"时,VC编译器会根据编译规则(相关的规则请查看MSDN)来区别std ...
- Elasticsearch删除数据之_delete_by_query
es参考版本:elasticsearch:5.5 _delete_by_query会删除所有query语句匹配上的文档,用法如下: curl -X POST "localhost:9200/ ...
- bypass disable_function总结学习
通常bypass的思路如下 1. 攻击后端组件,寻找存在命令注入的.web 应用常用的后端组件,如,ImageMagick 的魔图漏洞.bash 的破壳漏洞 2. 寻找未禁用的漏网函数,常见的执行命令 ...
- PHP 二维数组去重方法
php二维数组的去重策略,如果需要根据某字段去重(其他字段可能不一致),那么需要使用循环策略,如果去重的都是相同的(字段,值),那么可以用序列化方式. $allComments = array_map ...
- 在 bat 批处理中运行多次 mvn
在 bat 中运行 mvn 命令会出现这种情况,构建命令执行完成后会停留在的 mvn.bat 中,必需手工输入 exit 后,才会回到原来的脚本中继续运行.这是怎么回事? 到 maven 的安装目录下 ...
- 在AndroidStudio中使用单元测试
1. 前言 在Android开发中,如果对一个简单的功能,每次修改代码都重新运行到设备中进行测试,会浪费大量时间,降低开发工作效率.如果使用单元测试,编写单元测试类,执行测试单元测试类就可以对 ...
- RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除
现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换 ...