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');
随机推荐
- 并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- CDialog::DoModal()问题和_WIN32_WINNT
1.从CDialogEx派生自己的CMyDialog,到DoModal()时总提示 error C2039: "DoModal": 不是"CMyDialog"的 ...
- [NLP-CNN] Convolutional Neural Networks for Sentence Classification -2014-EMNLP
1. Overview 本文将CNN用于句子分类任务 (1) 使用静态vector + CNN即可取得很好的效果:=> 这表明预训练的vector是universal的特征提取器,可以被用于多种 ...
- IntelliJ IDEA利用Maven下载所需的JAR包到项目中
直接复制JetBrains/../conf/settings.xml后修改镜像出现问题,然后用了这里的settings.xml配置文件.
- C#_类
1:访问修饰符 访问修饰符可以定义应用程序中类成员的作用域.和C++有一些不同,下面说明一下: public:访问不受限制,public成员可以被任何其他类访问. private:访问只限于包含该成员 ...
- Mysql索引查询失效的情况
首先,复习一下索引的创建: 普通的索引的创建: CREATE INDEX (自定义)索引名 ON 数据表(字段); 复合索引的创建: CREATE INDEX (自定义)索引名 ON 数据 ...
- centos6.9实现双网卡绑定
1.创建bond0文件 # vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 NM_CONTROLLED=no #是否由networ ...
- Flutter移动电商实战 --(7)dio基础_POST请求的使用
这节学习一下POST请求的使用,其实POST和Get请求都是在工作中最重要的两种请求.比如我们要传递一组表单数据过去,这时候用Get请求就是不太合适的,使用POST比较好. SingleChildSc ...
- react-1
react 创建方法 首先确定你的电脑上面已经安装了node和npm 检查方法:window键 输入cmd 输入node -v 或者 npm -v 在全局安装create-react-app这条命令 ...
- LC 640. Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...