SQL Server - 布尔文字?

dpp*_*dpp 69 sql sql-server boolean literals

如何在SQL Server中编写文字布尔值?参见样品使用:

select * from SomeTable where PSEUDO_TRUE
Run Code Online (Sandbox Code Playgroud)

另一个样本:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 71

SQL Server没有布尔数据类型.正如@Mikael指出的那样,最接近的是比特.但这是一种数字类型,而不是布尔类型.此外,它仅支持2个值 - 01(和一个非值NULL).

SQL(标准SQL,以及T-SQL方言)描述了一个三值逻辑.布尔类型SQL应支持3个值- TRUE,FALSEUNKNOWN(以及,非值NULL).所以bit这不是一个很好的匹配.

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

  • 我想知道什么可能使SQL Server团队拥有位而不是布尔数据类型(值为true和false).布尔在所有应用程序域中都很自然.我相信他们仍然会在存储中使用1个字节来存储位数据类型.即使使用内部存储,他们也可以支持`True`和`False`作为SQL脚本中的语法糖. (7认同)

noc*_*che 37

select * from SomeTable where 1=1
Run Code Online (Sandbox Code Playgroud)

  • 那是我的最爱。 (2认同)

Dal*_*lex 15

根据微软的说法:搜索的语法是

[ WHERE <search_condition> ]*
Run Code Online (Sandbox Code Playgroud)

搜索条件是:

<search_condition> ::= 
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 
Run Code Online (Sandbox Code Playgroud)

而谓词是:

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
Run Code Online (Sandbox Code Playgroud)

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

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

DECLARE @B BIT
SET @B='True'
Run Code Online (Sandbox Code Playgroud)

但是在TSQL中你不能使用布尔常量而不是像这样的布尔表达式:

SELECT * FROM Somewhere WHERE 'True'
Run Code Online (Sandbox Code Playgroud)

不起作用.

但您可以使用布尔常量来构建双面搜索表达式,如下所示:

SEARCH * FROM Somewhere WHERE 'True'='True' 
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 15

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

CONVERT(bit,0) - false CONVERT(bit,1) - true

这给你一点不是布尔值.例如,您不能在if语句中使用该值:

IF CONVERT(bit, 0)
BEGIN
    print 'Yay'
END
Run Code Online (Sandbox Code Playgroud)

woudl不解析.你仍然需要写

IF CONVERT(bit, 0) = 0
Run Code Online (Sandbox Code Playgroud)

所以它不是非常有用.


Boh*_*ian 14

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

select * from SomeTable where true
Run Code Online (Sandbox Code Playgroud)

如果没有,他们都会接受

select * from SomeTable where 1=1
Run Code Online (Sandbox Code Playgroud)

当手动构建一个sql where子句时,这是一种廉价的方法来避免必须确定你的谓词是否是第一个,在这种情况下它需要一个"WHERE"或后一个,在这种情况下它需要一个"AND".使用上面的内容,一切都在前面"WHERE 1=1"

  • 亲爱的downvoters:我回答的最初问题**不是**指定服务器类型"sql-server",所以我回答了一般性问题,并附有"大多数数据库"的警告.我不明白为什么这值得进行投票. (3认同)
  • @dpp答案现在可以接受了吗?我已经给出了一个替代方案,所有数据库都将接受 (2认同)
  • 每个Microsoft SQL服务器都是一个SQL数据库服务器,但是并不是每个SQL数据库服务器都是一个* Microsoft * SQL服务器。就像每个苹果都是一个水果,但不是每个水果都是一个苹果(或者在MS情况下,可能是梨:) (2认同)

Dan*_*haw 6

SQL Server没有文字的true或false值.1=1在极少数情况下,您需要使用该方法(或类似方法).

一种选择是为true和false创建自己的命名变量

DECLARE @TRUE bit
DECLARE @FALSE bit
SET @TRUE = 1
SET @FALSE = 0

select * from SomeTable where @TRUE = @TRUE
Run Code Online (Sandbox Code Playgroud)

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

  • +1在存在的情况下对我有用(从project.quota_group_supplier qgs中选择1,带(nolock)其中qgs.project_quota_id = qg.project_quota_id),然后@TRUE否则@FALSE结束` (2认同)

Mik*_*son 5

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

哪有这回事。

您必须将值与使用= < > like .... 在 SQL Server 中最接近布尔值的是bit。这是一个整数,可以具有值null,01


Mat*_*t H 5

您可以使用值'TRUE''FALSE'。从https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/bit-transact-sql

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

  • 例如`选择'TRUE',其中'TRUE'`。它在 select 上下文中无法有意义地使用,where 子句也不起作用。SQL 解析器抱怨“TRUE”不是布尔值。同样,“select TRUE where TRUE”在这两个部分中均无效。总而言之。它通常不适用于 MS-SQL。 (2认同)