博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6.11 将分割数据转换为多值IN列表
阅读量:6953 次
发布时间:2019-06-27

本文共 1020 字,大约阅读时间需要 3 分钟。

问题

已经有了分隔数据,想要将其转换为WHERE子句IN列表中的项目。考虑下面的字符串:
7654,7698,7782,7788
要将该字符串用在WHERE子句中,但是下面的SQL语句是错误的,因为EMPNO是一个数值列:
select ename,sal,deptno
   from emp
  where empno in ( '7654,7698,7782,7788' )
因为EMPNO是一个数值列,而此IN列表是一个字符串值,所以此SQL语句会失败。现要将此字符串转换为用逗号分解的数值列表。
解决方案
表面上看SQL应该将分隔字符串作为一个分隔值列表对待,但是实际情况不是这样。当SQL遇到括在引号中的逗号时,并不知道此符号表示多值列表,SQL必须将括在引号中的内容作为一个整体对待,也就是一个字符串值。因此必须将字符串分解为各个单独的EMPNO。这种解决方案的关键就是需要遍历字符串,但并不是一个字符一个字符地遍历,而是要将这个字符串转换为有效的EMPNO值。

 

select empno, ename, sal, deptno  

   from emp 
  where empno in       
        (
 select substring_index(
        substring_index(list.vals,',',iter.pos),',',-1) empno
   from (select id pos from t10) as iter,       
        (select '7654,7698,7782,7788' as vals
           from t1) list
  where iter.pos <=
        (length(list.vals)-length(replace(list.vals,',','')))+1
        ) ;

 

+-------+--------+------+--------+

| empno | ename  | sal  | deptno |
+-------+--------+------+--------+
|  7654 | MARTIN | 1250 |     30 |
|  7698 | BLAKE  | 2850 |     30 |
|  7782 | CLARK  | 2450 |     10 |
+-------+--------+------+--------+

转载于:https://www.cnblogs.com/liang545621/p/7523170.html

你可能感兴趣的文章
Avoiding GREEDYDATA for logstash'grok
查看>>
统一Retrofit失败的处理情况
查看>>
查询ORACLE数据库操作记录
查看>>
disruptor:CAS实现高效(伪)无锁阻塞队列实践
查看>>
域用户开机自动加入本地管理员组VBS脚本+限制多点登录
查看>>
京东抢购服务高并发实践
查看>>
spring cloud redis lock
查看>>
CAT 使用小结
查看>>
使用Istio分布式跟踪应用程序
查看>>
关于android中PendingIntent.getBroadcase的注册广播
查看>>
debian-nagios3.2,linux+apache+mysql+php
查看>>
判断登陆权限的操作,登录后调到之前所操作的地址。
查看>>
Linux升级python版本
查看>>
跟我一起数据挖掘(19)——什么是数据挖掘(2)
查看>>
行链接和行迁移案例
查看>>
删除指定路径下的文件以及文件夹
查看>>
yum仓库
查看>>
DWR Server Push(服务器推技术) 实现即时聊天功能(WEB)
查看>>
VSCode 路径自动补全插件
查看>>
Windows下QQ聊天记录中图片的默认存放位置
查看>>