如何在select中选择内部select是返回结果的子串

时间:2009-10-05 16:31:38

标签: sql oracle plsql oracle10g

这是一个我认为应该有效的例子,但不是:

select * from TABLE_A where KEY in (
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824');

基本上,内部select语句返回一组带有'$$'前缀的结果。这用作TABLE_A中的查找键,它在键中不包含'$$'前缀。

如果我手动运行内部声明:

select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824'

复制第一个结果,让'8462928318772288542'运行外部选择语句

select * from TABLE_A where KEY = '8462928318772288542'

这很有效。

但是,如果我运行的是select in(select ...)语句,我就没有结果。

修改

此处使用的数据库是Oracle 10g。

TABLE_B中的DYNAMIC_KEY列是VARCHAR2

TABLE_A中的KEY列是CHAR 32

4 个答案:

答案 0 :(得分:1)

SELECT TABLE_A.* 
FROM TABLE_A a
INNER JOIN TABLE_B b ON a.KEY = b.sbustr(DYNAMIC_KEY,3)
WHERE b.DYNAMIC_KEY like '$$%' AND b.RECORD_ID='104251893783388824'

答案 1 :(得分:1)

您的问题是由TABLE_A.KEY中的数据类型“char(32)”与TABLE_B.DYNAMIC_KEY中的“varchar2”之间的比较产生的。 TABLE_A.KEY中的值由dbms空白填充到定义的大小32.

当您执行子查询并将结果复制到外部查询时,您将char(32)类型的列与文字字符串进行比较,dbms将其视为char(32)。意思是,它是空白填充的,因此比较起作用。

在原始查询中,您可以将“where KEY in (”更改为“where trim(KEY) in (”,然后查询就可以了。 trim()函数返回varchar2值。

答案 2 :(得分:0)

substring需要3个元素而不是2个元素。另外我怀疑key的值与子串的值不匹配。

答案 3 :(得分:0)

您是否可能需要在任一列上修剪掉拖尾空白?或者可能将它们都转换为相同的数据类型?