SQL Server的 – 布尔文字?
如何在SQL Server中编写文字布尔值? 看样品使用:
select * from SomeTable where PSEUDO_TRUE
另一个样本:
if PSEUDO_TRUE begin select 'Hello, SQL!' end
注意:上面的查询与我将如何使用它无关。 这只是testing文字布尔值。
提前致谢!
SQL Server没有布尔数据types 。 正如@Mikael所指出的那样,最接近的就是这个位。 但是这是一个数字types,而不是一个布尔types。 另外,它只支持2个值 – 0
或1
(和一个非值, NULL
)。
SQL(标准SQL以及T-SQL方言)描述了三值逻辑 。 SQL的布尔types应该支持3个值 – TRUE
, FALSE
和UNKNOWN
(以及非NULL
)。 所以这里实际上并不是一个好的比赛。
鉴于SQL Server不支持数据types ,我们不应该期望能够写入这个“types”的文字。
select * from SomeTable where 1=1
根据微软 :search的语法是
[ WHERE <search_condition> ]*
而search条件是:
<search_condition> ::= { [ NOT ] <predicate> | ( <search_condition> ) } [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] [ ,...n ]
而谓词是:
<predicate> ::= { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
正如你所看到的,你总是必须写两个expression式进行比较。 这里的search条件是布尔expression式,如1 = 1,a!= b
不要将searchexpression式与“True”或“False”等布尔常量混淆。 您可以将布尔常量分配给BITvariables
DECLARE @B BIT SET @B='True'
但在TSQL中,您不能使用布尔常量而不是像这样的布尔expression式:
SELECT * FROM Somewhere WHERE 'True'
不起作用。
但是您可以使用布尔常量来构build双向searchexpression式,如下所示:
SEARCH * FROM Somewhere WHERE 'True'='True'
这在任何其他答案中都没有提及。 如果你想要一个值,该orms(应)水合作为布尔值,你可以使用
CONVERT(bit,0) – false CONVERT(bit,1) – true
这给你一点不是布尔值。 例如,您不能在if语句中使用该值:
IF CONVERT(bit, 0) BEGIN print 'Yay' END
woudl不parsing。 你仍然需要写
IF CONVERT(bit, 0) = 0
所以它不是非常有用的。
大多数数据库会接受这个:
select * from SomeTable where true
如果不是,他们都会接受
select * from SomeTable where 1=1
在手动build立sql where子句时,这是避免必须确定谓词是否是第一个的便宜方法,在这种情况下,它需要一个WHERE
或一个下一个谓词,在这种情况下,它需要一个AND
。 使用上面的内容,所有内容都以“ AND
SQL Server没有文字真或假的值。 在极less数情况下,您需要使用1=1
方法(或类似方法)。
一种select是创build自己的命名variables为true和false
DECLARE @TRUE bit DECLARE @FALSE bit SET @TRUE = 1 SET @FALSE = 0 select * from SomeTable where @TRUE = @TRUE
但是这些只会在批处理的范围内存在(你将不得不在每个批次中重新声明它们)
如何在SQL Server中编写文字布尔值?
从SomeTable中select* PSEUDO_TRUE
哪有这回事。
您必须将值与使用= < > like ...
东西进行比较。 在SQL Server中最接近你得到的是一个布尔值。 这是一个整数,可以有null
, 0
和1
的值。
你应该考虑一个“真正的价值”是除0之外的所有东西,而不仅仅是1.因此,而不是1 = 1,你应该写1 <> 0。
因为当你使用参数(@param <> 0)时,你可能会遇到一些转换问题。
最知道的是将控制的真实值转换为-1而不是1的Access。
您可以使用值'TRUE'
和'FALSE'
。 从https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql :
string值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0。
我质疑在TSQL中使用布尔值的价值。 每当我开始为Booleans&For循环开始时,我意识到我正在像C程序员而不是SQL程序员那样处理这个问题。 当我换挡时,问题变得微不足道了。
在SQL中,您正在操作数据集。 “哪里BOOLEAN”是无效的,因为不改变你正在使用的设置。 您需要将每行与filter子句进行比较才能生效。 Table / Resultset 是一个iEnumerable,SELECT语句是一个FOREACH循环。
是的,“WHERE IsAdmin = True”比“WHERE IsAdmin = 1”更好。
是的,当dynamic生成TSQL时,“WHERE True”将比“WHERE 1 = 1,…”更好。
也许,传递一个布尔值到存储过程可能会使if语句更具可读性。
但大多数情况下,如果你的TSQL中有更多的IF,WHILE和Temp表,那么你应该重构它的可能性就越大。
我希望这能回答这个问题的意图。 尽pipeSQL Server中没有布尔值,但是如果您有一个从Access转换的布尔types的数据库,那么在Access中工作的短语是“… WHERE Foo”(Foo是布尔列名称)。 它可以replace为“… WHERE Foo <> 0”…这个工作。 祝你好运!
select * from SomeTable where null is null
要么
select * from SomeTable where null is not null
也许这是最好的performance?