【问题标题】:Logical AND on boolean columns in SQLSQL中布尔列的逻辑与
【发布时间】:2021-01-23 02:34:10
【问题描述】:

我们如何在 SQLselect 子句中逻辑与连接两个布尔列

我想到的伪SQL:

select boolean_col_A AND boolean_col_B as joint_bool from foo where id = 42

请注意,我不是通过布尔谓词来限制记录的数量,而是在结果集中创建一个“综合”,即代理列。

我觉得必须有一个简单的方法来实现这一点,但我没有看到它。它应该适用于 Oracle、Postgres 和 H2。

【问题讨论】:

  • 你的语法不行吗?如果没有,请尝试使用if(a and b, True, False),或case ... when ... then,或者可能是按位与(结果相同)
  • 嗯,你是对的......我的伪 SQL 至少在 H2 中工作。我很困惑。
  • @MarcelStör 我会说标签一个并包括其他有问题的。
  • 这是有效的 ANSI SQL 语法。
  • Oracle 没有布尔数据类型,因此所有 DBMS 不应该有一个代码

标签: sql


【解决方案1】:

恕我直言,使用 case 可能是更好的选择,因为包含 Oracle,据我所知,Oracle 不能有布尔列,所以通常我们只使用 varchar(1)char(1)t/f

因此,您可以考虑在所有数据库中使用带有t/f 的字符串列,而不是使用boolean 列,然后一个简单的case(如下所示)可以与所有这些列一起使用。

select case when colA = 't' and colB = 't' then 't' else 'f' end as joint_bool 
from [TableName]

【讨论】:

  • 恕我直言,Oracle 中布尔值的逻辑表示形式是 NUMBER(1),但您的回答当然仍然适用。
  • 当然 number 是一个更好更好的选择,但我的工作环境(oracle)使用 sting,所以我有点习惯了。
  • 注意,如果涉及空值,这将无法正常工作。
【解决方案2】:

感谢所有反馈。我的应用程序使用 Liquibase 来抽象模式定义。它映射布尔类型如下:

  • H2:布尔值
  • Postgres:布尔值
  • 甲骨文:NUMBER(1)

来源:https://stackoverflow.com/a/28626825/131929

这也是 @codeflush.dev 在 cmets 中的 Q 的答案。

您为每个 RDBMS 中的每个布尔值使用哪种数据类型?

鉴于上述有效 RDBMS 类型列表,在结果集中处理此代理布尔列的一种方法是使用 BITAND。与此问题相关的所有数据库产品都支持它。

如果您不能使用BITAND,则另一个答案中提出的更通用的CASE WHEN 方法可能没问题。

【讨论】:

    【解决方案3】:
    select 
    (case when boolean_col_A =1 and boolean_col_B=1 then 'true'
    else 'false'
    end  ) joint_bool 
    from foo where id = 42
    

    试试这个。

    【讨论】:

    • 实际上和 T.Peter 之前的回答一样,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2011-08-17
    • 1970-01-01
    相关资源
    最近更新 更多