Oracle:当同一查询中更具体的值为null时,如何获取默认值?

use*_*715 4 sql oracle union entity-attribute-value

这个头衔很残酷,但我不知道怎么说.

我有一个绑定到user_id的键值表,用于存储整个站点的用户首选项.如果用户没有进入并更新他们的任何设置,那么每当我要求一个密钥时(比如说"FAVORITE_COLOR"它将为null,所以我需要拉出我与默认用户绑定的默认设置, user_id = 0.

我正在考虑UNION的行,将user_id = 0的结果放到查询的底部,但这只会导致重复.我不确定它是否可能,但我还是喜欢能说出类似的话:

SELECT val FROM k_v WHERE user_id = 123 AND k = 'FAVORITE_COLOR'
UNION IF val IS NULL
SELECT val FROM k_v WHERE user_id = 0 AND k = 'FAVORITE_COLOR';
Run Code Online (Sandbox Code Playgroud)

有什么好办法吗?

编辑:感谢您的所有帮助.如果你的用例只是抓住这个问题的单个值,那么来自dual的NVL正是你想要的,但是如果你打算在同一个查询中返回多个对,那么看一下其他的一些答案,因为他们可能实际上更有意义的实施.

我接下来讨论了ZeissS的建议,因为它很简单,仍然是一个查询,可以使用多个k,v对,并且我没有问题做可能的重复过滤客户端.

Jan*_*cki 6

用这个,

select
  nvl(
    (SELECT val FROM k_v WHERE user_id = 123 AND k = 'FAVORITE_COLOR'),
    (SELECT val FROM k_v WHERE user_id = 0 AND k = 'FAVORITE_COLOR')
  ) val 
from dual
;
Run Code Online (Sandbox Code Playgroud)

来自Oracle文档,

NVL(expr1,expr2):NVL允许您使用查询结果中的字符串替换null(作为空白返回).如果expr1为null,则NVL返回expr2.如果expr1不为null,则NVL返回expr1.