我正在尝试复制工作场景。 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 | |
+----+---------+------+
,我们不会将其返回。但对于3
和4
,我们的表中没有记录,所以我想创建另一个包含错误代码的虚拟列。数据列应为null。
用户输入不应强制转到5
子句。我们可以在查询的任何地方使用它。
我正在考虑分割输入in
的一些方法,并将它们用作行。然后使用它们id
与left join
一起查找Table1
中存在且不存在的记录,并使用Table1
来确定case
或0
作为错误代码。
通过查询欣赏我们可以做的任何其他方式。
答案 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。