【发布时间】:2015-02-28 13:27:19
【问题描述】:
我正在处理的项目中遇到问题,我不能给你实际的代码,但我已经创建了一个可执行的示例代码,如下所示
这里temp和temp_id是两张表
-
temp表包含逗号分隔的 id 列表,即VARCHAR2 -
temp_id表包含实际 ID,即NUMBER
我想通过ids 从temp 表的逗号分隔列表中获取ids 来搜索temp_id 表中的行
//DDLs to create table
CREATE TABLE temp(ids VARCHAR2(4000));
CREATE TABLE temp_id(data_id NUMBER);
//DMLs to populate test data
INSERT INTO temp VALUES('1, 2, 3');
INSERT INTO temp_id VALUES(1);
INSERT INTO temp_id VALUES(2);
INSERT INTO temp_id VALUES(3);
INSERT INTO temp_id VALUES(4);
INSERT INTO temp_id VALUES(5);
此查询不起作用
SELECT * FROM temp_id WHERE data_id IN (SELECT to_number(COLUMN_VALUE) FROM XMLTABLE(SELECT ids FROM temp));
工作查询
SELECT * FROM temp_id WHERE data_id IN (SELECT to_number(COLUMN_VALUE) FROM XMLTABLE('1, 2, 3'));
以上两个查询之间的区别在于我在第一个查询中使用来自temp 表的列,在第二个查询中使用直接引用varchar2。不明白为什么不工作的原因?我错过了什么吗?我认为可能存在一些数据类型不匹配但无法弄清楚。
【问题讨论】:
-
'1, 2, 3' 不是一个有效的数字,它是一个字符串!
-
我做了
to_number(COLUMN_VALUE)。您可以检查第二个查询是否有效。 -
这是一个
Varying IN lists问题。看我的回答。 -
修改了主题标题,使其更加明确。
标签: sql oracle where-in xmltable