0

我有以下查询

    select * from table_1 
    where Conditions in 
         (select case when check_condition = 'Y' then 'Condition_1' 
                 else 'N/A' end as Check_condition 
          from table_2 
          WHERE id = 1122)

其中 table_1 包含列中的值,Conditions如下所示。条件_1,条件_2

这可以正常工作并将结果返回给我。

我想在in子句中使用多个选择语句,我做了如下。

    select * from table_1
    where Conditions in (
         select ''''||
             (select case when check_condition = 'Y' then 'Condition_1' 
               else 'N/A' end as Check_condition 
               from table_2 
               WHERE id = 1122)||''''||','''||
                  (select case when check_condition = 'Y' then 'Condition_2'
                        else 'N/A' end as Check_condition 
                  from table_2 WHERE id = 1122)||''''
                 from dual
                )

内部查询(在 in 子句内)给了我预期的正确结果 -

'Condition_1','Condition_2' 

当我将其复制粘贴到父查询时,它可以正常工作并显示结果。

select * from table_1 where Conditions in ('Condition_1','Condition_2')

我的问题是,当我使用第二个查询时它没有给出任何结果。我知道子查询将返回与外部查询中的行匹配的结果。但它向我显示了空的结果集。

我正在使用 oracle 11g

谁能帮帮我.. 提前谢谢大家。

4

2 回答 2

4

关于要求,这个问题有点不清楚。我认为您想要的是table1仅在以下情况下选择记录:

  • 行匹配“Condition_1”或“Condition_2”
  • check_condition='是'
  • 有一行table2ID = 1122

从您的问题中不清楚check_condition是列还是变量,以及它是否属于哪个表的列。因此,这个解决方案可能是错误的,但它说明了原理。

select * from table1 t1
where t1.conditions in ('Condition_1','Condition_2')
and t1.check_condition = 'Y'
and exists
        ( select null from table2 t2
          where t2.id = 1122 )

如果这不能提供您需要的解决方案,请修改您的问题,以便说明您需要实现的业务逻辑,并包括相关的表格描述。

于 2013-07-26T08:26:18.720 回答
1

您最终不会in像手动执行时那样将两个值传递到子句中:

select * from table_1 where Conditions in ('Condition_1','Condition_2')

您正在传递一个值,它是值的串联:

select * from table_1 where Conditions in ('''Condition_1'',''Condition_2''')

并且没有condition匹配该连接值,因此您不会得到任何结果。您可以执行以下操作:

select * from table_1 where Conditions in (
  select case when check_condition = 'Y' then 'Condition_1' else 'N/A' end
  from table_2 WHERE id = 1122
  union all
  select case when check_condition = 'Y' then 'Condition_2' else 'N/A' end
  from table_2 WHERE id = 1122
)

或者可能,如果我遵循您正在做的事情(这是值得怀疑的,因为我不确定我是否了解您的数据模型!):

select * from table_1 where check_condition != 'Y' or Conditions in (
  select 'Condition_1' from table_2 WHERE id = 1122
  union all
  select 'Condition_2' from table_2 WHERE id = 1122
)

似乎您应该能够通过连接更干净地执行此操作,但我认为我们需要查看结构和示例数据以进一步了解正在发生的事情。

于 2013-07-26T08:19:47.993 回答