为什么PostgreSQL中的聚合函数不适用于布尔数据类型

托马斯·格里夫(Tomas Greif)

为什么在不首先转换为某种整数类型的情况下不能在聚合函数中使用布尔值?在许多情况下,从布尔数据类型的列中计算总和,平均值或相关性是很有意义的。

考虑以下示例,必须始终将布尔输入强制转换int为使其有效:

select
   sum(boolinput::int),
   avg(boolinput::int),
   max(boolinput::int),
   min(boolinput::int),
   stddev(boolinput::int),
   corr(boolinput::int,boolinputb::int)   
from
   (select 
      (random() > .5)::boolean as boolinput,
      (random() > .5)::boolean as boolinputB 
    from 
      generate_series(1,100)
   ) a

PostgreSQL文档中:

“ true”状态的有效文字值是:TRUE't''true''y''yes''on''1'

对于“ false”状态,可以使用以下值:FALSE'f''false''n''no''off''0'

因为按照定义,TRUE平等1FALSE平等,0我不理解为什么必须进行强制转换。

允许布尔值进行聚合也会产生有趣的副作用-例如,我们可以简化许多case语句:

当前版本(简洁易懂):

select sum(case when gs > 50 then 1 else 0 end) from generate_series(1,100) gs;

使用老式的铸造运算符::

select sum((gs > 50)::int) from generate_series(1,100) gs;

直接聚合布尔值(当前不起作用):

select sum(gs > 50) from generate_series(1,100) gs;

在其他DBMS中是否可以直接聚合布尔值?为什么在PostgreSQL中无法做到这一点?

丹尼斯·德·伯纳迪

因为根据定义,TRUE等于1,FALSE等于0,所以我不理解为什么必须进行强制转换。

根据您在问题中引用的文档,按照定义,布尔值不是1表示TRUE,0表示FALSE。在C中也不是真的,其中TRUE是非零的值。

因此,在这方面模仿C的语言也不是,C语言有很多。对于诸如Ruby之类的语言也不是,其中任何非Nil / non-False的值都等于True,包括零和空字符串。POSIX shell及其变体也没有,如果返回码为零,则测试返回码将生成TRUE,否则返回FALSE。

重点是,布尔值是布尔值,具有从平台到下一个平台的各种丰富多彩的实现细节。不是整数。

目前尚不清楚您对Postgres的平均真/假值的期望。我怀疑许多平台是否会为此产生结果。

甚至对布尔值求和也很尴尬:期望Postgres对输入值进行OR运算,还是对TRUE值进行计数?

无论如何,都有一些布尔聚合函数,即bool_or()bool_and()这些更换更标准any()some()Postgres偏离标准的原因是由于潜在的歧义。根据文档:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

如果子查询返回带有布尔值的一行,则ANY可以视为引入子查询,也可以视为聚合函数。

http://www.postgresql.org/docs/current/static/functions-aggregate.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么$别名不适用于此jQuery函数

来自分类Dev

函子不适用于需要特定类型的数据类型

来自分类Dev

DISTINCT关键字不适用于SQL Server中的图像数据类型

来自分类Dev

为什么这些条件不适用于模板类型?

来自分类Dev

Oracle CHAR数据类型不适用于实体框架

来自分类Dev

Haskell-函数“长度”不适用于自定义数据类型

来自分类Dev

为什么“大于”不适用于char类型?

来自分类Dev

排序数据类型TEXT不适用于mySQL

来自分类Dev

货币数据类型字段的汇总字段不适用于自定义实体

来自分类Dev

为什么Map在Groovy中不适用于GString?

来自分类Dev

为什么C ++中的“不完整类型错误”不适用于嵌套类

来自分类Dev

struct int数据类型不适用于关系运算符

来自分类Dev

在HTML中使用类不适用于CSS,但常规数据类型可以

来自分类Dev

为什么__dir __()不适用于python中的模块?

来自分类Dev

为什么PostgreSQL中的聚合函数不适用于布尔数据类型

来自分类Dev

为什么constexpr不适用于构造函数?

来自分类Dev

为什么$别名不适用于此jQuery函数

来自分类Dev

为什么exist()函数起作用,但不适用于布尔语句?

来自分类Dev

SQLite数据库Where子句不适用于文本数据类型Android

来自分类Dev

数据类型验证不适用于Web窗体脚手架

来自分类Dev

会话用户数据类型不适用于Codeigniter中的特定功能

来自分类Dev

SimpleITK N4BiasFieldCorrection,不适用于任何数据类型

来自分类Dev

为什么 numba 不适用于此嵌套函数?

来自分类Dev

为什么 GetProcAddress 不适用于 OutputDebugString 函数

来自分类Dev

为什么我的布尔数组不适用于 CCC 的问题拉格曼?

来自分类Dev

Pandas - 数据类型对象 - .loc 不适用于数字

来自分类Dev

OpenCL 的 clEnqueueReadBufferRect 适用于 int 但不适用于 double 数据类型

来自分类Dev

为什么 argparse 自定义类型函数不适用于 nargs?

来自分类Dev

为什么我的函数适用于矩阵但为什么不适用于向量?

Related 相关文章

  1. 1

    为什么$别名不适用于此jQuery函数

  2. 2

    函子不适用于需要特定类型的数据类型

  3. 3

    DISTINCT关键字不适用于SQL Server中的图像数据类型

  4. 4

    为什么这些条件不适用于模板类型?

  5. 5

    Oracle CHAR数据类型不适用于实体框架

  6. 6

    Haskell-函数“长度”不适用于自定义数据类型

  7. 7

    为什么“大于”不适用于char类型?

  8. 8

    排序数据类型TEXT不适用于mySQL

  9. 9

    货币数据类型字段的汇总字段不适用于自定义实体

  10. 10

    为什么Map在Groovy中不适用于GString?

  11. 11

    为什么C ++中的“不完整类型错误”不适用于嵌套类

  12. 12

    struct int数据类型不适用于关系运算符

  13. 13

    在HTML中使用类不适用于CSS,但常规数据类型可以

  14. 14

    为什么__dir __()不适用于python中的模块?

  15. 15

    为什么PostgreSQL中的聚合函数不适用于布尔数据类型

  16. 16

    为什么constexpr不适用于构造函数?

  17. 17

    为什么$别名不适用于此jQuery函数

  18. 18

    为什么exist()函数起作用,但不适用于布尔语句?

  19. 19

    SQLite数据库Where子句不适用于文本数据类型Android

  20. 20

    数据类型验证不适用于Web窗体脚手架

  21. 21

    会话用户数据类型不适用于Codeigniter中的特定功能

  22. 22

    SimpleITK N4BiasFieldCorrection,不适用于任何数据类型

  23. 23

    为什么 numba 不适用于此嵌套函数?

  24. 24

    为什么 GetProcAddress 不适用于 OutputDebugString 函数

  25. 25

    为什么我的布尔数组不适用于 CCC 的问题拉格曼?

  26. 26

    Pandas - 数据类型对象 - .loc 不适用于数字

  27. 27

    OpenCL 的 clEnqueueReadBufferRect 适用于 int 但不适用于 double 数据类型

  28. 28

    为什么 argparse 自定义类型函数不适用于 nargs?

  29. 29

    为什么我的函数适用于矩阵但为什么不适用于向量?

热门标签

归档