如果某个数字已经存在于表中,则返回1,否则返回0。我试过了,但不管用:
select case when 100 in (select distinct id from test) then '1' else '0' from test
我想要类似于PostgreSQL中已经存在的exists函数的东西,但是我想要的不是true和false,而是1或0。
true
false
1
0
nxagd54h1#
**EXISTS**会产生boolean结果。
EXISTS
boolean
实现所需结果的简单方法是将结果转换为integer:
integer
SELECT (EXISTS (SELECT FROM test WHERE id = 100))::int;
TRUE变成了1。FALSE变成了0。请参阅:
TRUE
FALSE
UNION ALL
LIMIT 1
SELECT 1 FROM test WHERE id = 100 UNION ALL SELECT 0 LIMIT 1;
如果找到行,则返回1,Postgres将因LIMIT 1而停止执行。否则,返回0。
免责声明适用于UNION ALL解决方案:这依赖于未记录的行为,Postgres将按顺序执行UNION ALL项。在Postgres 11之前一直是这种情况,在Postgres中添加了Parallel Append。实际上现在仍然是这种情况(当前Postgres 15),因为检索单个行永远不会触发Parallel Append计划。但它仍然是未记录的行为,因此您可能不想依赖它。请参阅:
Parallel Append
abithluo2#
如果要测试的字段是主键(或其他一些唯一约束),则只需返回计数(始终为0或1):
SELECT count(*) FROM test WHERE id = 100;
gkl3eglg3#
简单快捷:
SELECT ISNULL((SELECT 1 FROM test WHERE id = 100), 0) res
3条答案
按热度按时间nxagd54h1#
**
EXISTS
**会产生boolean
结果。实现所需结果的简单方法是将结果转换为
integer
:TRUE
变成了1
。FALSE
变成了0
。请参阅:
或者使用
UNION ALL
/LIMIT 1
(可能会稍微快一点):如果找到行,则返回
1
,Postgres将因LIMIT 1
而停止执行。否则,返回0
。免责声明适用于
UNION ALL
解决方案:这依赖于未记录的行为,Postgres将按顺序执行UNION ALL
项。在Postgres 11之前一直是这种情况,在Postgres中添加了Parallel Append
。实际上现在仍然是这种情况(当前Postgres 15),因为检索单个行永远不会触发Parallel Append
计划。但它仍然是未记录的行为,因此您可能不想依赖它。请参阅:abithluo2#
如果要测试的字段是主键(或其他一些唯一约束),则只需返回计数(始终为0或1):
gkl3eglg3#
简单快捷: