我在Oracle中遇到了查询问题。如果我的查询返回null,我想分配值-1,如果在表中至少有一个值,我想分配ID值。这是我的查询
SELECT IAM_EXP_RESULT_ID
FROM (SELECT * FROM IAM_EXP_RESULT ORDER BY START_DATE ASC)
WHERE RESULT = 0 AND ROWNUM = 1
上面的查询不返回任何行,因为该表为空。我想创建一个变量,在这种情况下分配值-1,或者在至少存在值的情况下分配IAM_EXP_RESULT_ID值。
答案 0 :(得分:0)
您可以使用COUNT
分析函数和COALESCE
:
SELECT COALESCE(
IAM_EXP_RESULT_ID,
CASE WHEN ct > 0 THEN -1 ELSE NULL END
) AS IAM_EXP_RESULT_ID
FROM (
SELECT IAM_EXP_RESULT_ID,
RESULT,
START_DATE,
COUNT( your_value_column ) OVER () AS ct
FROM IAM_EXP_RESULT r
UNION ALL
SELECT -1, 0, NULL, 0 FROM DUAL
ORDER BY START_DATE ASC NULLS LAST
)
WHERE RESULT = 0
AND ROWNUM = 1
答案 1 :(得分:0)
我为此目的使用聚合:
SELECT COALESCE(MAX(IAM_EXP_RESULT_ID), -1)
FROM (SELECT *
FROM IAM_EXP_RESULT
ORDER BY START_DATE ASC
)
WHERE RESULT = 0 AND ROWNUM = 1;
聚合查询总是返回一行,如果没有匹配行,则返回NULL
COALESCE()
将值替换为您想要的值。
注意:您可能需要子查询中的RESULT = 0
。
答案 2 :(得分:0)
如果表没有行且您不能使用count(*)或其他聚合函数,那么除了其他示例之外,此示例将返回值:
SELECT data_length FROM all_tab_cols
WHERE owner = 'YOU'
AND table_name = 'EMP'
AND column_name = 'ENAMES'
UNION ALL
SELECT -1 FROM dual
WHERE NOT EXISTS
(
SELECT data_length FROM all_tab_cols
WHERE owner = 'YOU'
AND table_name = 'EMP'
AND column_name = 'ENAMES'
)
/
上述查询的结果为-1。顶部可以返回行,也可以不返回行。如果顶部返回行,那么你得到它返回的任何东西。如果没有,那么你得到-1。