我需要帮助
当我像这样执行时,我在行中有记录123,456,789
这个正在工作
select * from table1 where num1 in('123','456')
但是当我执行
select * from table1 where num1 in(select value from table2)
未找到结果集-为什么?
答案 0 :(得分:0)
检查数据类型varchare2或数字
尝试
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
答案 1 :(得分:0)
首先要记住的重要事项:请勿将数字存储在字符数据类型中。使用NUMBER
或INTEGER
。其次,如果您要存储> 1的字符,则总是比VARCHAR2
更喜欢CHAR
数据类型。
您在评论之一中说num1
列的类型为char(4)
。 CHAR
数据类型的问题在于,如果您的字符串的宽度为3个字符,它将通过添加额外的1个空格字符使其变为4个字符来存储记录。 VARCHAR2
仅存储您在插入/更新时传递的尽可能多的字符,而不是空白填充。
要验证您可以运行select length(any_char_col) from t;
要解决您的问题,IN
条件永远不会得到满足,因为实际要比较的是
WHERE 'abc ' = 'abc'
-注意左侧运算符中的多余空间。
要解决此问题,一个不错的选择是在右侧表达式中填充所需的空格以进行正确的比较。函数RPAD( string1, padded_length [, pad_string] )
可用于此目的。因此,您的查询应看起来像这样。
select * from table1 where num1 IN (select rpad(value,4) from table2);
这可能会利用列num1
上的索引(如果存在)。
另一种方法是在LHS上使用RTRIM
,这仅在RTRIM(num1)
上有基于函数的索引时才有用
select * from table1 where RTRIM(num1) in(select value from table2);
因此,所有这些示例的总括之处始终是使用NUMBER
类型来存储数字,并且比起VARCHAR2
更喜欢CHAR
作为字符串。
请参阅Demo,以全面了解正在发生的事情。
编辑:您似乎正在存储用逗号分隔的数字。您可以执行以下操作。
SELECT *
FROM table1 t1
WHERE EXISTS (
SELECT 1
FROM table2 t2
WHERE ',' ||t2.value|| ',' LIKE '%,' || rtrim(t1.num1) || ',%'
);
请参见Demo2
存储逗号分隔的值势必会引起问题,最好进行更改。
答案 2 :(得分:0)
存储逗号分隔的值可能是引起问题的原因。 您可以尝试使用regexp_substr分割逗号。
答案 3 :(得分:0)
我使用字符串数组找到了解决方案
SELECT T.* FROM TABLE1 T,
(SELECT TRIM(VALUE)AS VAL FROM TABLE2)TABLE2
WHERE
TRIM(NUM1) IN (SELECT COLUMN_VALUE FROM TABLE(FUNC_GETSTRING_ARRAY(TABLE2.VAL)))
谢谢
答案 4 :(得分:0)
让我先告诉你
您已将值存储在
table2
的{{1}}中。
因此,您如何将数据与is comma seperated
和table1
进行匹配。
不可能。
这就是为什么您在结果集中没有得到任何值的原因。