zoukankan      html  css  js  c++  java
  • 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 |
    +-------+--------+------+--------+

  • 相关阅读:
    LOJ3160 「NOI2019」斗主地
    常系数齐次线性递推
    最小树形图——朱刘算法学习小记
    Linux系统分区(一)
    Linux系统启动过程(二)
    Linux系统目录结构(三)
    cross_val_score
    sklearn.pipeline.Pileline
    DBSCAN密度聚类算法
    特征选择
  • 原文地址:https://www.cnblogs.com/l10n/p/7523170.html
Copyright © 2011-2022 走看看