6.11 将分割数据转换为多值IN列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6.11 将分割数据转换为多值IN列表相关的知识,希望对你有一定的参考价值。

问题

已经有了分隔数据,想要将其转换为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 |
+-------+--------+------+--------+

以上是关于6.11 将分割数据转换为多值IN列表的主要内容,如果未能解决你的问题,请参考以下文章

组合行 + 连接大型数据集的值(将 SQL 导出转换为多值)

pandas 根据条件将数据转换为多步时间序列

为多标签文本分类转换数据集

实体框架将纯连接查找表转换为多对多关系

将大型单片单线程应用程序转换为多线程架构的建议?

基础知识 各类数据类型方法