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