【问题标题】:SQL Server - boolean literal?SQL Server - 布尔文字?
【发布时间】:2011-11-02 11:55:17
【问题描述】:

如何在 SQL Server 中写入文字布尔值?查看示例使用:

select * from SomeTable where PSEUDO_TRUE

另一个示例:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

注意:上面的查询与我将如何使用它无关。这只是为了测试文字布尔值。

【问题讨论】:

  • 不,只是想看看 true 在 where 子句中是否有效。首先,我不知道真假的字面意思。
  • SQL Server 没有布尔数据类型,也没有必需的运算符IS TRUEIS UNKNOWN 等(尽管 SQL-99 标准两者都有)。一种常见的解决方法是使用受约束的CHAR(1)CHECK (col1 IN ('T', 'F'))

标签: sql sql-server boolean literals


【解决方案1】:

SQL Server 没有布尔值 data type。正如@Mikael 所指出的,最接近的近似值是位。但那是数字类型,而不是布尔类型。此外,它仅支持 2 个值 - 01(以及 1 个非值,NULL)。

SQL(标准 SQL,以及 T-SQL 方言)描述了 Three valued logic。 SQL 的布尔类型应支持 3 个值 - TRUEFALSEUNKNOWN(以及非值 NULL)。所以bit 在这里实际上并不是一个很好的匹配。

鉴于 SQL Server 不支持 数据类型,我们不应该期望能够编写该“类型”的文字。

【讨论】:

  • 我想知道是什么让 SQL Server 团队拥有位而不是布尔数据类型(值 true 和 false)。布尔值在所有应用程序域中都是如此自然。我相信他们仍然会在存储中使用 1 个字节来存储位数据类型。即使使用内部存储作为位,它们至少可以在 SQL 脚本中支持 TrueFalse 作为语法糖。
  • 可能性是因为它在 C 中是这样的。没有这样的值 truefalse,而是真值(不是 0)和假值(0)。 C99 添加了 stdbool.h,它只定义了这些宏,但在后期处理时,任何此类值分别替换为 1 和 0。
【解决方案2】:
select * from SomeTable where 1=1

【讨论】:

  • 有效!不幸的是,它不是文字,1=1 的结果是布尔值,但它不是文字。
【解决方案3】:

大多数数据库都会接受这个:

select * from SomeTable where true

但是,有些数据库(例如 SQL Server、Oracle)没有布尔类型。在这些情况下,您可以使用:

select * from SomeTable where 1=1

顺便说一句,如果手动构建 sql where 子句,这是简化代码的基础,因为您可以避免必须知道要添加到 where 子句的条件是否是 first 一个(前面应该是"WHERE"),或者一个后续 一个(前面应该是"AND")。通过始终以 "WHERE 1=1" 开头,添加到 where 子句的所有条件(如果有)都以 "AND" 开头。

【讨论】:

  • An expression of non-boolean type specified in a context where a condition is expected, near 'group' 我正在使用 MSSQL
  • 亲爱的投票者:我回答的最初问题没有没有指定服务器类型“sql-server”,所以我用一个通用答案回答了通用问题,并附有“警告”大多数数据库”。我不明白为什么这值得一票否决。
  • 您最好在获得更多反对票之前删除您的答案。不知何故,我只是指出SQL 而不是MSSQL 是我的错。
  • @dpp 现在可以接受答案了吗?我给出了一个替代方案,所有数据库都将接受
  • 每个 Microsoft SQL 服务器都是 SQL 数据库服务器,但并非每个 SQL 数据库服务器都是 Microsoft SQL 服务器。就像每个苹果都是水果一样,但并非每个水果都是苹果(或者在 MS 的情况下,可能是梨:)
【解决方案4】:

这在任何其他答案中都没有提到。如果你想要一个 orms (应该)水合为布尔值的值,你可以使用

CONVERT(bit, 0) -- 假 CONVERT(bit, 1) -- 真

这为您提供了一些不是布尔值的信息。例如,您不能在 if 语句中使用该值:

IF CONVERT(bit, 0)
BEGIN
    print 'Yay'
END

不会解析。你仍然需要写

IF CONVERT(bit, 0) = 0

所以它不是非常有用。

【讨论】:

    【解决方案5】:

    根据Microsoft: 搜索语法是

    [ WHERE <search_condition> ]*
    

    搜索条件为:

    <search_condition> ::= 
        { [ NOT ] <predicate> | ( <search_condition> ) } 
        [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
    [ ,...n ] 
    

    谓词是:

    <predicate> ::= 
        { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
    

    如您所见,您总是必须编写两个表达式进行比较。 这里的搜索条件是 布尔表达式 比如 1=1, a!=b

    不要将搜索表达式与 'True''False'布尔常量 混淆。您可以将布尔常量分配给 BIT 变量

    DECLARE @B BIT
    SET @B='True'
    

    但在 TSQL 中,您不能使用布尔常量代替布尔表达式,如下所示:

    SELECT * FROM Somewhere WHERE 'True'
    

    它不会起作用。

    但是您可以使用布尔常量来构建这样的双向搜索表达式:

    SEARCH * FROM Somewhere WHERE 'True'='True' 
    

    【讨论】:

      【解决方案6】:

      SQL Server 没有文字真或假值。在极少数情况下,您需要使用 1=1 方法(或类似方法)。

      一种选择是为真假创建自己的命名变量

      DECLARE @TRUE bit
      DECLARE @FALSE bit
      SET @TRUE = 1
      SET @FALSE = 0
      
      select * from SomeTable where @TRUE = @TRUE
      

      但这些只会存在于批次的范围内(您必须在要使用它们的每个批次中重新声明它们)

      【讨论】:

      • 这不起作用,如上述答案中所述。 "在预期条件的上下文中指定的非布尔类型的表达式,靠近 '@TRUE'"
      • +1 这对我有用 case when exists( select 1 from project.quota_group_supplier qgs with (nolock) where qgs.project_quota_id=qg.project_quota_id) then @TRUE else @FALSE end
      【解决方案7】:

      您可以使用值'TRUE''FALSE'。 来自https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql

      字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。

      【讨论】:

      • 你能澄清一下你的意思吗?它在 WHERE 子句中应该可以正常工作。
      • 例如select 'TRUE' where 'TRUE'。它也不能在选择上下文中有意义地使用,where 子句也不起作用。 SQL 解析器抱怨 'TRUE' 不是布尔值。同样select TRUE where TRUE 在这两个部分都无效。总而言之。它通常不适用于 MS-SQL。
      • 好的,但是在比较一个值时它确实有效,例如WHERE column = 'TRUE'IF @value = 'FALSE'
      【解决方案8】:

      如何在 SQL Server 中写入文字布尔值?
      select * from SomeTable where PSEUDO_TRUE

      没有这样的东西。

      您必须将值与使用= &lt; &gt; like ... 的值进行比较。在 SQL Server 中最接近布尔值的是 bit。这是一个整数,它的值可以是null01

      【讨论】:

        【解决方案9】:

        你应该认为一个“真值”是除了 0 而不仅仅是 1 之外的所有东西。 所以你应该写 10,而不是 1=1。

        因为当您使用参数 (@param 0) 时,您可能会遇到一些转换问题。

        最知名的是 Access,它将控件上的 True 值转换为 -1 而不是 1。

        【讨论】:

          【解决方案10】:

          我质疑在 TSQL 中使用布尔值的价值。 每次我开始希望使用 Booleans 和 For 循环时,我意识到我正在像 C 程序员而不是 SQL 程序员那样处理这个问题。当我换档时,问题变得微不足道。

          在 SQL 中,您正在处理数据集。 “WHERE BOOLEAN”无效,因为不会更改您正在使用的集合。您需要将每一行与过滤子句进行比较才能有效。表/结果集一个 iEnumerable,SELECT 语句一个 FOREACH 循环。

          是的,“WHERE IsAdmin = True”比“WHERE IsAdmin = 1”更易读

          是的,动态生成 TSQL 时,“WHERE True”会比“WHERE 1=1, ...”更好。

          也许,将布尔值传递给存储过程可能会使 if 语句更具可读性。

          但大多数情况下,TSQL 中的 IF、WHILE 和临时表越多,就越有可能重构它。

          【讨论】:

            【解决方案11】:

            我希望这能回答问题的意图。尽管 SQL Server 中没有布尔值,但如果您的数据库具有从 Access 转换的布尔类型,则在 Access 中有效的短语是“...WHERE Foo”(Foo 是布尔列名)。它可以替换为 "...WHERE Foo0" ... 这很有效。祝你好运!

            【讨论】:

              【解决方案12】:

              您可以使用“真”或“假”字符串来模拟布尔类型数据。

              Select *
              From <table>
              Where <columna> = 'True'
              

              我认为这种方式可能比只放 1 慢,因为它是用 Convert_implicit 函数解决的。

              【讨论】:

                【解决方案13】:
                select * from SomeTable where null is null
                

                select * from SomeTable where null is not null
                

                也许这是最好的表现?

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-08-03
                  • 2010-12-19
                  • 2011-10-30
                  • 2013-02-09
                  • 1970-01-01
                  • 2019-05-17
                  相关资源
                  最近更新 更多