【问题标题】:Return string when division result is zero除法结果为零时返回字符串
【发布时间】:2014-06-07 07:47:37
【问题描述】:

我有一个这样的 SQL 查询:

SELECT 
u.id,
tu.score/(CASE tu.mo_count  WHEN 0 THEN NULL ELSE tu.mo_count END) AS score_avg
FROM tournament_userscore tu
INNER JOIN users u ON u.id = tu.user_id
WHERE tournament_id = 1
ORDER BY tu.score DESC

tu.mo_count 为零时,Null 已被替换而不是零。如何为这一行设置像'EMPTY' 这样的字符串:

tu.score/(CASE tu.mo_count  WHEN 0 THEN NULL ELSE tu.mo_count END) AS score_avg

我的意思是当除法结果为时,我想返回“anything ”字符串。

【问题讨论】:

    标签: sql postgresql null case coalesce


    【解决方案1】:

    如果您不想使用 CASE,可以使用 NULLIF 和 COALESCE:

    SELECT 
      u.id,
      COALESCE(tu.score/NULLIF(tu.mo_count, 0), 0) AS score_avg
    FROM tournament_userscore tu
      INNER JOIN users u ON u.id = tu.user_id
    WHERE 
      tournament_id = 1
    ORDER BY 
      tu.score DESC;
    

    【讨论】:

      【解决方案2】:

      尝试将CASE-statement 移到外面:

      SELECT 
      u.id,
      CASE WHEN tu.mo_count = 0 THEN 'EMPTY' ELSE (tu.score/tu.mo_count)::text END as score_avg
      FROM tournament_userscore tu
      INNER JOIN users u ON u.id = tu.user_id
      WHERE tournament_id = 1
      ORDER BY tu.score DESC
      

      【讨论】:

      • 谢谢老兄。工作正常。你能为我解释一下 ::text 吗?
      • 一列中的所有值都需要具有相同的类型,因此::text 将比率转换为文本。简单的例子:select 'foo' union select 42;
      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2011-11-22
      相关资源
      最近更新 更多