• 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 |
    +-------+--------+------+--------+

  • 相关阅读:
    JAVA 动态代理
    IDEA 配置阿里云Maven
    JAVA Spring5静态代理
    Spring5 常用注解
    react
    Angular
    微信小程序
    H5
    vue-ui
    jQuery
  • 原文地址:https://www.cnblogs.com/l10n/p/7523170.html
Copyright © 2020-2023  润新知