如何在SQL Server中编写文字布尔值?参见样本使用:
select * from SomeTable where PSEUDO_TRUE
另一个样本:
if PSEUDO_TRUE
begin
select 'Hello, SQL!'
end
注意:上面的查询与我将如何使用它无关。它只是测试文字布尔值。
答案 0 :(得分:65)
SQL Server没有布尔值data type。正如@Mikael指出的那样,最接近的是比特。但这是一种数字类型,而不是布尔类型。此外,它仅支持2个值 - 0
或1
(以及一个非值,NULL
)。
SQL(标准SQL,以及T-SQL方言)描述了Three valued logic。 SQL的布尔类型应该支持3个值 - TRUE
,FALSE
和UNKNOWN
(以及非值NULL
)。所以bit
实际上并不是一个很好的匹配。
鉴于SQL Server不支持数据类型,我们不应该期望能够写出那种“类型”的文字。
答案 1 :(得分:34)
select * from SomeTable where 1=1
答案 2 :(得分:15)
根据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'
答案 3 :(得分:14)
在任何其他答案中都没有提及。如果你想要一个orms(应该)水合为布尔值的值,你可以使用
CONVERT(bit,0) - false CONVERT(bit,1) - true
这给你一点不是布尔值。您不能在if语句中使用该值,例如:
IF CONVERT(bit, 0)
BEGIN
print 'Yay'
END
woudl不解析。你仍然需要写
IF CONVERT(bit, 0) = 0
所以它不是非常有用。
答案 4 :(得分:12)
大多数数据库都接受这个:
select * from SomeTable where true
但是有些数据库(例如SQL Server,Oracle)没有布尔类型。在这些情况下,您可以使用:
select * from SomeTable where 1=1
顺便说一句,如果手动构建一个sql where子句,这是简化代码的基础,因为你可以避免知道你要添加到where子句的条件是 first < / em>一个(前面应该是"WHERE"
),或者一个后续的一个(前面应该是"AND"
)。始终以"WHERE 1=1"
开头,添加到where子句的所有条件(如果有)都以"AND"
开头。
答案 5 :(得分: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
但这些只会存在于批次的范围内(您必须在每个要使用它们的批次中重新声明它们)
答案 6 :(得分:4)
如何在SQL Server中编写文字布尔值?
从SomeTable中选择*,其中PSEUDO_TRUE
没有这样的事情。
您必须使用= < > like ...
将值与某些内容进行比较。 SQL Server中最接近布尔值的是bit。这是一个整数,可以包含值null
,0
和1
。
答案 7 :(得分:4)
您可以使用值'TRUE'
和'FALSE'
。
来自https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql:
字符串值TRUE和FALSE可以转换为位值:TRUE 转换为1,FALSE转换为0。
答案 8 :(得分:3)
您应该考虑“真实值”是除0之外的所有内容,而不仅仅是1。 因此,代替1 = 1,您应该写1&lt;&gt; 0。
因为当您使用参数(@param&lt;&gt; 0)时,您可能会遇到一些转换问题。
最知道的是Access,它将控件上的True值转换为-1而不是1。
答案 9 :(得分:1)
我质疑在TSQL中使用布尔值的价值。 每次我开始希望布尔和&对于循环,我意识到我正在接近问题,就像C程序员和&amp;不是SQL程序员。当我换档时问题变得微不足道。
在SQL中,您正在操作SET数据。 &#34;在哪里布尔&#34;是无效的,因为不会改变您正在使用的集合。您需要将每一行与某些内容进行比较,以使filter子句生效。表/结果集 是一个iEnumerable,SELECT语句 是 一个FOREACH循环。
是,&#34; WHERE IsAdmin = True&#34;比#34; WHERE Ismin = 1&#34;
更好阅读是的,&#34; WHERE True&#34;比#34;哪里1 = 1,...&#34;动态生成TSQL时。
也许,将布尔值传递给存储过程可能会使if语句更具可读性。
但大多数情况下,IF,WHILE&amp; S&amp;您在TSQL中拥有的临时表,您重构它的可能性越大。
答案 10 :(得分:1)
我希望这能回答问题的意图。虽然SQL Server中没有布尔值,但如果您的数据库具有从Access转换的布尔类型,则在Access中使用的短语是“... WHERE Foo”(Foo是布尔列名称)。它可以替换为“...... WHERE Foo&lt;&gt; 0”......这样可行。祝你好运!
答案 11 :(得分:1)
您可以使用'True'或'False'字符串来模拟布尔型数据。
Select *
From <table>
Where <columna> = 'True'
我认为这种方式可能比仅放置1慢,因为它已通过Convert_implicit函数解决。
答案 12 :(得分:-1)
select * from SomeTable where null is null
或
select * from SomeTable where null is not null
也许这是最佳表现?