在我的Postgres数据库中,我正在尝试执行以下查询:
with
user_details as
(
SELECT username
FROM user_management WHERE username = 'admin'
)
select (case
when user_details.username is NOT NULL then 'user found'
else
'no user found' end) as username from user_details
上述查询将返回用户名并按预期工作。但是,如果我传递了数据库中不存在的用户名,那么我希望CASE查询返回"未找到用户",但查询根本不返回任何内容。
但当我尝试执行以下查询时:
select (case
when (SELECT username
FROM user_management WHERE username = 'sadmin') is not null then 'user found'
else
'no user found' end) as username
它按预期工作,并返回"未找到用户"。
为什么在第一种情况下使用WITH查询时没有得到预期的输出?with查询中是否缺少某些内容?
当您从user_details
中选择输出时,您得到的是0 rows
,这就是您在最终结果中没有看到任何o/p的原因。在第二个查询中,您从空的子查询中选择o/p,然后生成user not found
。你可能会遇到这样的错误
ERROR: more than one row returned by a subquery used as an expression
。当有更多用户具有相同的用户名时。所以你的查询应该像这个
select (case
when exists(SELECT username
FROM user_management WHERE username = 'sadmin') then 'user found'
else
'no user found' end) as username
我假设列username
在表user_management
中是唯一的,因此当用户名存在于表中时,CTE返回1行;如果用户名不存在,则返回nothing
如果表中不存在用户名,那么您可能认为CTE会返回NULL
,但事实并非如此
因此,如果CTE返回1行(用户名存在(,则代码工作正常,但如果它不返回任何内容,则选择from user_details
的SELECT
语句也将不返回任何信息,因为没有可供选择的行
使用聚合,即使用户不存在,也可以在结果中获得1行:
SELECT COALESCE(MAX(username), 'no user found') username
FROM user_management
WHERE username = 'admin'
请参阅演示