在PostgreSQL查询中检查布尔值的真/假结果

7

我在我的Web应用程序中运行以下SQL查询:

SELECT EXISTS (
SELECT id
FROM user
WHERE membership=1244)

我原本期望结果返回一个true(布尔数据),但实际上我得到的是't'或'f'来表示false。 如何让它返回一个标准的布尔值给我的lua代码?
我找到了以下帖子: Reading boolean correctly from Postgres by PHP 所以我尝试将我的代码更改为以下内容:
SELECT EXISTS ::int (
SELECT id
FROM user
WHERE membership=1244)

或者
SELECT ::INT (SELECT EXISTS (
SELECT id
FROM user
WHERE membership=1244))

但是我遇到了一个语法错误。
你能告诉我处理这个问题的最佳方法吗?我应该将结果中的't'强制转换为布尔值吗?还是有一种方法可以告诉postgresql返回true/false而不是't'/'f'?

谢谢。

4个回答

25

你就快成功了

SELECT EXISTS (SELECT id FROM user WHERE membership=1244)::int 

在Postgres 9.1.9中,它可以正常工作。请参见http://sqlfiddle.com/#!1/bfe1e/2。 此外,PHP中的0或1可用作布尔值。 - Barbara Laird
没问题。你给了我一个使用sqlfiddle的借口。我今天才知道它,所以我很兴奋。 :) - Barbara Laird

7

您的第一个查询确实返回一个布尔值。查询的返回值显示为t

select exists (select 1);
 exists 
--------
 t

但是如果您检查它的类型,它是一个布尔型:

select pg_typeof(exists (select 1));
 pg_typeof 
-----------
 boolean

您需要查看lua的postgresql驱动程序手册,以了解如何正确处理它。


5
尝试使用CASE
select       
  (case when exists (SELECT id FROM user WHERE membership = 1244)
    then 1 
    else 0 
  end) as column;

my test fiddle


我不知道 SQLFiddle 的存在。谢谢! - Barbara Laird

0

你的初始查询本身就很好:

SELECT id FROM user WHERE membership=1244

你只需要检查它是否返回一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接