SQL:如何动态返回表中不存在的记录的错误代码

时间:2016-03-02 09:22:40

标签: sql oracle oracle11g

我正在尝试复制工作场景。 sqlfiddle for Oracle数据库无法正常工作,因此我无法重新创建该表。

说我有一张如下表

Table1
+----+------+
| ID | Col1 |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+

现在我们运行where条件的查询。 in的{​​{1}}子句由用户和运行时传递,可以更改。 假设用户输入where

所以SQL就像

1,2,4,5

此查询的结果将是

select t.* from Table1 t where t.id in (1,2,4,5);

现在输出我期待的应该是下面的

+----+------+
| ID | Col1 |
+----+------+
|  1 | A    |
|  2 | B    |
+----+------+ 

由于用户未输入+----+---------+------+ | ID | ErrCode | Col1 | +----+---------+------+ | 1 | 0 | A | | 2 | 0 | B | | 4 | 404 | | | 5 | 404 | | +----+---------+------+ ,我们不会将其返回。但对于34,我们的表中没有记录,所以我想创建另一个包含错误代码的虚拟列。数据列应为null。

用户输入不应强制转到5子句。我们可以在查询的任何地方使用它。

我正在考虑分割输入in的一些方法,并将它们用作行。然后使用它们idleft join一起查找Table1中存在且不存在的记录,并使用Table1来确定case0作为错误代码。

通过查询欣赏我们可以做的任何其他方式。

2 个答案:

答案 0 :(得分:2)

这就是

SQL> WITH table_filter AS
  2   (SELECT regexp_substr(txt, '[^,]+', 1, LEVEL) id
  3      FROM (SELECT '1,2,4,5' AS txt FROM dual)  -- User input here
  4    CONNECT BY regexp_substr(txt, '[^,]+', 1, LEVEL) IS NOT NULL),
  5  table1 AS -- Sample data
  6   (SELECT 1 id,
  7           'A' col1
  8      FROM dual
  9    UNION ALL
 10    SELECT 2,
 11           'B'
 12      FROM dual
 13    UNION ALL
 14    SELECT 3,
 15           'C'
 16      FROM dual)
 17  SELECT f.id,
 18         CASE
 19             WHEN t.id IS NULL THEN
 20              404
 21             ELSE
 22              0
 23         END AS err_code,
 24         t.col1
 25    FROM table_filter f
 26    LEFT OUTER JOIN table1 t
 27      ON t.id = f.id;

ID                             ERR_CODE COL1
---------------------------- ---------- ----
1                                     0 A
2                                     0 B
5                                   404 
4                                   404 

SQL> 

答案 1 :(得分:1)

Oracle安装程序

CREATE TABLE Table1 ( id, col1 ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 2, 'B' FROM DUAL;

<强>查询

SELECT i.COLUMN_VALUE AS id,
       NVL2( t.col1, 0, 404 ) AS ErrCode,
       t.col1
FROM   TABLE( SYS.ODCINUMBERLIST( 1, 2, 4, 5 ) ) i
       LEFT OUTER JOIN
       Table1 t
       ON ( i.COLUMN_VALUE = t.id );

<强>输出

ID ERRCODE COL1
-- ------- ----
 1       0 A
 2       0 B
 4     404
 5     404

可以使用PL / SQL或外部语言动态构建id集合,然后作为绑定变量传递。有关示例,请参阅my answer here