我有一个 postgres 查询,它根据一个条件验证列是否为空,这是一个不需要函数的正常查询,可能会过度使用函数方法,因为这是集合中的独特场景。
查询按预期工作,但如果可能的话我想缩小逻辑。
CASE WHEN LOWER(COALESCE(users.user_number, users.customer_number)) LIKE 'vip%' THEN NULL
ELSE COALESCE(users.user_badge, users.customer_badge) END AS normal_badge,
CASE WHEN LOWER(COALESCE(users.user_number, users.customer_number)) LIKE 'vip%' THEN NULL
ELSE users.expiration_date END AS expiration_date,
CASE WHEN LOWER(COALESCE(users.user_number, users.customer_number)) LIKE 'vip%' THEN NULL
ELSE COALESCE(users.user_number, users.customer_number) END AS standard_user,
使用 CTE 尝试此操作:
WITH user_data AS (
SELECT *,
LOWER(COALESCE(user_number, customer_number)) AS lower_number
FROM users
)
SELECT
CASE WHEN lower_number LIKE 'vip%' THEN NULL
ELSE COALESCE(user_badge, customer_badge)
END AS normal_badge,
CASE WHEN lower_number LIKE 'vip%' THEN NULL
ELSE expiration_date
END AS expiration_date,
CASE WHEN lower_number LIKE 'vip%' THEN NULL
ELSE COALESCE(user_number, customer_number)
END AS coalesced_number
FROM user_data;