我想避免經常使用 CASE 運算式,尤其是對于像這里這樣不那么復雜的邏輯。有沒有更好的辦法?
CASE
WHEN lower(player_status::text) in ( 'active'::text,'live'::text)
THEN true
ELSE false
END
如果沒有 CASE,我可以獲得相同的輸出嗎?
謝謝!
uj5u.com熱心網友回復:
其實你不需要這個CASE運算式。
您可以直接選擇布爾運算式:
SELECT COALESCE(lower(player_status::text), '') IN ('active'::text, 'live'::text)
FROM ...
該函式COALESCE()用于防止運算式NULL在player_statusis 的情況下回傳NULL。
如果player_status不可為空,則可以省略:
SELECT lower(player_status::text) IN ('active'::text, 'live'::text)
FROM ...
uj5u.com熱心網友回復:
所以我收集到你正在尋找的最終結果是一個用戶名和用戶狀態串列,但對于狀態為“活動”或“活動”的用戶,你希望顯示布林值 true 而不是實際存盤在資料庫中的值,對? 接受的答案有效,但我個人發現使用select 常量更容易閱讀:
SELECT name, true as player_status
FROM players.player_data
WHERE player_status IN ('active', 'live')
這將僅顯示活躍/在線玩家,他們的狀態將顯示為 true。如果您需要查詢回傳所有玩家,無論其狀態如何,同時仍然為活躍玩家進行文本替換,您可以簡單地將上述查詢與其相反的查詢結合在一起,盡管我不確定這是否不那么復雜或可讀此執行緒中提出的另外兩個解決方案:
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 層而不是在資料庫查詢中進行此替換,這將使整個問題變得毫無意義,盡管這更多是個人喜好問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383294.html
標籤:PostgreSQL的 布尔值 案件
