比较“IN”子句和结果集中的项目

时间:2012-10-09 16:24:02

标签: sql oracle

我想实现如下内容,我有以下查询(简单如此),

SELECT ENT_ID,TP_ID FROM TC_LOGS WHERE ENT_ID IN (1,2,3,4,5).

现在表TC_LOGS可能没有IN子句中的所有项。假设表TC_LOGS只有1,2。我想比较IN子句中的项目,即1,2,3,4,5与1,2(结果集),得到一个结果为FOUND - 1,2 NOT FOUND - 3,4,5。我已经通过在应用程序代码中对结果集应用XSL转换来实现这一点,但是我想在查询中实现这一点,我觉得这更像是对这个问题的优雅解决方案。此外,我尝试使用NVL进行以下查询,只是为了将FOUND和NOT FOUND项目分开,

SELECT NVL(ENT_ID,"NOT FOUND") FROM TC_LOGS WHERE ENT_ID IN(1,2,3,4,5)

我期待结果为1,2,未找到,未找到,未找到

但是上面的查询并没有返回任何结果..如果有人可以在这里引导我走上正确的道路,我会很感激..非常感谢。

3 个答案:

答案 0 :(得分:2)

假设IN列表中的项目可以(或可以来自)其他查询,您可以执行类似

的操作
WITH src AS (
  SELECT level id
    FROM dual
 CONNECT BY level <= 5)
SELECT nvl(ent_id, 'Not Found' )
  FROM src
       LEFT OUTER JOIN tc_logs ON (src.id = tc_logs.ent_id)

就我而言,src查询只生成数字1到5.您可以轻松地从不同的表中获取数据,将数字加载到您使用{{1}查询的集合中运算符,将数字加载到您查询的临时表中,具体取决于TABLE列表数据的确定方式。

答案 1 :(得分:0)

NVL不起作用,因为当与IN语句不匹配时,不会返回任何值(包括NULLS)。

你可以做的是这样的事情:

SELECT NVL(ENT_ID, "NOT FOUND") 
FROM TC_LOGS
RIGHT OUTER JOIN (
   SELECT 1 AS 'TempID' UNION 
   SELECT 2 UNION 
   SELECT 3 UNION
   SELECT 4 UNION 
   SELECT 5) AS Sub ON ENT_ID = TempID

外部联接将为ENT_ID返回NULLS,其中没有匹配项。注意,我不是Oracle人员所以我不能保证这种语法是完美的。

答案 2 :(得分:0)

如果你有一个表(让我们使用表src)包含所有(1,2,3,4,5)值,你可以使用完全连接。 你可以使用(WITH src AS(SELECT level id FROM dual CONNECT BY level&lt; = 5)作为src表)

         SELECT 
           ent_id,tl.tp_id,src.tp_id 
         FROM 
           src
        FULL JOIN
          tc_logs tl
        USING (ent_id)
        ORDER BY
          ent_id

以下是oracle full join的网站。http://psoug.org/snippet/Oracle-PL-SQL-ANSI-Joins-FULL-JOIN_738.htm