没有 CASE 表达式有没有办法做到这一点?

Is there a way to do this without CASE expression?

我想避免如此频繁地使用 CASE 表达式,尤其是对于不像这里那么复杂的逻辑。有没有更好的方法?

CASE
WHEN lower(player_status::text) in ( 'active'::text,'live'::text)
THEN true
ELSE false
END                  

不使用 CASE 可以得到相同的输出吗?

谢谢!

实际上您不需要 CASE 表达式。
可以直接select布尔表达式:

SELECT COALESCE(lower(player_status::text), '') IN ('active'::text, 'live'::text) 
FROM ...

函数COALESCE()用于防止在player_statusNULL时returnNULL的表达式。

如果 player_status 不可为空,则可以省略:

SELECT lower(player_status::text) IN ('active'::text, 'live'::text) 
FROM ...

所以我收集到您正在寻找的最终结果是用户名和用户状态的列表,但是对于状态为“活动”或“实时”的用户,您希望显示布尔值 true 而不是实际存储的值在数据库中,对吗?接受的答案有效,但我个人觉得使用 select constants:

更容易阅读
SELECT name, true as player_status
FROM players.player_data
WHERE player_status IN ('active', 'live')

这将只显示 active/live 名玩家,他们的状态将显示为 true。如果您需要查询 return 所有玩家,无论状态如何,同时仍然为活跃玩家进行文本替换,您可以简单地将上面的查询与其逆查询结合在一起,尽管我不确定这是否更少比该线程中提出的其他两个解决方案复杂或可读:

SELECT name, true as player_status
FROM players.player_data
WHERE player_status IN ('active', 'live')

UNION ALL

SELECT name,false
FROM players.player_data
WHERE (player_status is null) 
   OR (player_status NOT IN ('active', 'live'))

综上所述,就个人而言,我可能会在 UI 层进行替换,而不是在数据库查询中进行替换,这会使整个问题变得毫无意义,尽管这更多是个人喜好问题而不是.