在AWS RedShift中,boolean_column = trueboolean_column IS true有区别吗?

doctor 建议"始终显式判断布尔值"https://docs.aws.amazon.com/redshift/latest/dg/r_Boolean_type.html

我有一个带有三个布尔列的红移表.以下查询运行时没有错误,并返回预期结果(即,如果三列中的任何一列为真,则my_any_columntrue):

-- Does work
SELECT
    (
        boolean_column_01 = true
        OR boolean_column_02 = true
        OR boolean_column_03 = true
    ) AS my_any_column
FROM
    my_example_table;

但是,如果我按如下方式更改查询,则会出现错误:

-- Does not work
SELECT
    (
        boolean_column_01 is true
        OR boolean_column_02 is true
        OR boolean_column_03 is true
    ) AS my_any_column
FROM
    my_example_table;

以下是使用is的查询的错误消息:

SQL Error [XX000]: ERROR: Assert
  Detail:
  -----------------------------------------------
  error:  Assert
  code:      1000
  context:   arg_func_info.is_nullable_ == fld->a_nullable() - arg_func_info.is_nullable_=0, fld->a_nullable()=1.
  query:     1008428
  location:  cg_expr_fn_builder.cpp:8993
  process:   padbmaster [pid=4919]
  -----------------------------------------------

最奇怪的是,下面的查询没有错误地运行:

-- Does work
SELECT
    (
        boolean_column_01 is true
        OR boolean_column_02 is true
        OR boolean_column_03 = true
    ) AS my_any_column
FROM
    my_example_table;

对于2*is和1*=,查询有效(与顺序无关),但一旦有3*is,它就会失败.

作为一种解决办法,我可以始终使用=而不是is,但我在文档中找不到这样的建议.

推荐答案

和=在红移中不是等价的.根据红移文件

"可以使用IS比较来判断只能作为WHERE子句中的谓词的布尔值.不能将IS比较与 Select 列表中的布尔值一起使用."

参见:https://docs.aws.amazon.com/redshift/latest/dg/r_Boolean_type.html(是的,这与您链接的页面相同)

正如您可能预期的那样,这(部分)是由于对Null的处理.RedShift中的条件使用三进制(三值)逻辑(TRUE、FALSE、UNKNOWN),并通过执行"is"比较,逻辑移回二进制.大多数人更好地理解二进制代码,因此显式判断可以减少错误(对于阅读代码的人来说也更清楚).请参阅:https://docs.aws.amazon.com/redshift/latest/dg/r_logical_condition.html

Sql相关问答推荐

从日期开始向前填充重复项

PostgreSQL基于2个COLS的任意组合 Select 唯一行

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

最近3个月收到的邮箱总数

如何在presto中映射id与名称

在Netezza SQL中将字符DataType转换为整型DataType

根据是否出现过零来筛选数据(跨多行)

Postgres SQL查询从字符串中获取邮箱地址

如何用SQL组合客户拥有的产品

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

如何计算两个非周期性时间序列+分组的重叠持续时间

如何在 postgres 中旋转某些数据字段

按所选的值将记录分组到不同的列中

如何显示最常引用条目的详细信息

字符串从更改到表列和查询中的一行的转换错误

使用 R 遍历 SQL 查询,每次替换一个变量

Postgres:表的累积视图

SQL Server Where 条件

SQL 中的问题与包含最大日期的记录连接

BigQuery 将一行拆分为多列