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');
随机推荐
- Java字节码例子解析
举个简单的例子: public class Hello { public static void main(String[] args) { String string1 = ...
- java线程之sleep
翻译:https://www.journaldev.com/1020/thread-sleep-java 简述 Thread .sleep()方法用来暂停当前线程的执行,以毫秒为单位.还有另一个重载方 ...
- antd-mobile的DatePicker分钟精度半小时
项目要求,在时间选择上需要精确到分钟,且分钟只能半小时,既0分钟或者是30分钟. 前期引用的时间控件是antd-mobile的DatePicker组件,具体用法可参考:https://mobile.a ...
- 15.反转链表 Java
题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路 本题的关键就是在于对next域的赋值,同时对下一个节点进行保存,然后对把下一个节点赋给新的节点,这样依次循环完所有的节点.每次使新插入的节 ...
- Django知识
复习下django的知识. 1,安装: #pip install django 2.安装完毕后,在当前目录创建工程: #django-admin startproject mysite 执行上方的命令 ...
- PHP-生产随机密码
public function dd(){ error_reporting(E_ALL^E_NOTICE^E_WARNING);$arr1 = array(0,1,2,3,4,5,6,7,8,9);$ ...
- 性能分析 | JVM发生内存溢出的8种原因及解决办法
推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...
- 客户端连接虚拟机上的MYSQL报错
这个原因是因为虚拟机的数据库拒绝其他主机访问 所以需要设置虚拟机的mysql 打开mysql mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' ID ...
- 摘抄java基础
1.Java中Static的相关用法总结?(静态方法:静态变量:静态代码块) public static void main(String args[])执行的关键,在于有static.有了stati ...
- HttpURLConnection 多线程下载
影响下载的速度 * 宽带的带宽 * 服务器的限制 * 服务器的资源固定,开启的线程越多抢占的资源就越多 import java.io.InputStream; import java.io.Rando ...