我认为这并不难。我正在编写Oracle-SQL代码以从SQL提取数据:
select ID, Qty from TableOne where ID in ('A', 'B', 'C')
我希望数据库在IN条件下某些项目匹配时显示查询结果,如果在IN条件下这些项目不匹配,则返回默认值。 例如,我希望结果是:
+----+-----------+
| ID | Qty |
+----+-----------+
| A | 3 |
| A | 5 |
| B | 4 |
| C | Not Found |
+----+-----------+
表TableOne中没有ID = C的地方。
有什么简单的方法可以对结果进行编码? 非常感谢!
答案 0 :(得分:3)
将COALESCE
,NVL
或CASE
与LEFT OUTER JOIN
一起使用,并在子查询分解子句中指定ID:
WITH ids_to_match( id ) AS (
SELECT 'A' FROM DUAL UNION ALL
SELECT 'B' FROM DUAL UNION ALL
SELECT 'C' FROM DUAL
)
select i.ID,
COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from ids_to_match i
LEFT OUTER JOIN TableOne t
ON ( t.id = i.id )
或使用一个集合和一个表集合表达式:
select i.COLUMN_VALUE AS ID,
COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from TABLE( SYS.ODCIVARCHAR2LIST( 'A', 'B', 'C' ) ) i
LEFT OUTER JOIN
TableOne t
ON ( t.id = i.COLUMN_VALUE )
答案 1 :(得分:2)
您可以将LEFT JOIN
与UNION ALL
结合使用:
WITH ALL_ID AS (
SELECT 'A' AS ID FROM DUAL UNION ALL
SELECT 'B' AS ID FROM DUAL UNION ALL
SELECT 'C' AS ID FROM DUAL
)
SELECT A.ID, t.Qty -- REPLACE NULL WITH NOT FOUND
FROM ALL_ID A ID LEFT JOIN
Table t
ON t.ID = A.ID;
答案 2 :(得分:0)
如果这对您有用:
scope :currently_open, -> { "use Store#currently_open? here" }