postgres中的CASE查询未返回预期的输出



在我的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_detailsSELECT语句也将不返回任何信息,因为没有可供选择的行

使用聚合,即使用户不存在,也可以在结果中获得1行:

SELECT COALESCE(MAX(username), 'no user found') username
FROM user_management 
WHERE username = 'admin'

请参阅演示

最新更新