无法使用Oracle子查询(有条件)

时间:2018-12-13 10:43:32

标签: oracle oracle11g

我需要帮助

当我像这样执行时,我在行中有记录123,456,789

这个正在工作

select * from table1 where num1 in('123','456')

但是当我执行

select * from table1 where num1 in(select value from table2)

未找到结果集-为什么?

5 个答案:

答案 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)

首先要记住的重要事项:请勿将数字存储在字符数据类型中。使用NUMBERINTEGER。其次,如果您要存储> 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 seperatedtable1进行匹配。 不可能这就是为什么您在结果集中没有得到任何值的原因

相关问题