【问题标题】:Changing a query on Postgres to use only the Standard SQL Clauses将 Postgres 上的查询更改为仅使用标准 SQL 子句
【发布时间】:2023-03-28 22:41:01
【问题描述】:

我对 Postgres 进行了查询,并使用了 Postgres 9.4 或更高版本中可用的 FILTER 子句,但我被告知我只能使用标准 SQL 子句。

我的查询是关于计算已屠宰的动物数量,将显示每个企业和动物类型的屠宰动物数量:

Enterprise(id or name) || cow || sheep || chicken
MacDonals              ||  5  ||  5  ||    1     
Burguer King           ||  7  ||  4  ||    2     
KFC                    ||  1  ||  0  ||    10    

所以我在 POSTGRES 9.4 上进行了本机查询:

SELECT e.name
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='cow'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='sheep'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='chicken'))
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ( ae.enterprise_id = e.id)
INNER JOIN animal a
ON ( ae.animal_id=a.id )
GROUP BY e.id

所以,我尝试对每种动物进行子查询,但效果并不理想。

【问题讨论】:

  • 那已经是标准的SQL了
  • 我也是这么想的,但是 Filter 子句是 postgres 9.4 或更高版本中的一个较新功能,它在 mysql 中的等价物无法存在或以相同的方式执行。那么,Case 子句更适合以标准化的方式编写查询。
  • 过滤子句 is 是 SQL 标准的一部分。在 SQL 特性或 SQL 标准方面,MySQL 几乎不是基准。如果您想要在 Postgres MySQL 上运行的语句,那么您不应该请求“仅标准 SQL”语句。
  • 谢谢,你说的很清楚。

标签: sql postgresql ansi-sql


【解决方案1】:

如果我正确理解 filter 的工作原理,可以通过在 count 函数中使用 case 表达式来翻译:

SELECT e.name
  ,COUNT(case when a.type='cow' then 'X' end) as cow
  ,COUNT(case when a.type='sheep' then 'X' end) as sheep
  ,COUNT(case when a.type='chicken' then 'X' end) as chicken
FROM enterprise e
INNER JOIN animal_enterprise ae
  ON ae.enterprise_id = e.id
INNER JOIN animal a
  ON ae.animal_id = a.id
GROUP BY e.id, e.name

我忽略了您查询中的一些异常情况,例如使用 p.id??当在任何地方都没有定义别名 p,或者在没有第二个参数的情况下使用 coalesce

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多