【问题标题】:Return Boolean Value as TRUE or FALSE in Select (PostgreSQL/pgAdmin)在 Select (PostgreSQL/pgAdmin) 中将布尔值返回为 TRUE 或 FALSE
【发布时间】:2016-03-30 03:32:35
【问题描述】:

在 PostgreSQL(9.4 版,pgAdmin3)中,当对带有布尔列的表进行选择时,数据输出显示“t”或“f”。我想在不编写 CASE 语句或执行 JOINS 等的情况下将布尔值转换为 TRUE 或 FALSE。

顺便说一句,根据 PostgreSQL 自己的documentation 这种行为不是 SQL 标准。

关键字 TRUE 和 FALSE 是首选(符合 SQL 的)用法。

PS:只有在 pgAdmin 中使用 SQL 编辑器时才会发生这种情况。使用 pgAdmin 对象浏览器,向下钻取到同一个表,右键单击,查看数据,查看前 100 行,相同的布尔列显示为 TRUE 或 FALSE,符合预期/标准。

【问题讨论】:

  • 显示为“t”/“f”还是“TRUE”/“FALSE”只是显示问题。布尔值返回 TRUE 或 FALSE 的值(注意,没有引号)。如何在显示器上显示取决于该软件。我强烈建议不要尝试返回字符串值来解决此处的显示问题。
  • 正确 - 只是一个外观问题。我将 pgAdmin 添加到我的问题的标题中以进行澄清。也专门在 pgAdmin SQL 编辑器中显示。所以我猜这只是 pgAdmin 下一个版本中的增强请求 - 与他们自己的文档和 SQL 标准保持一致;-)

标签: sql postgresql boolean


【解决方案1】:

如果您只想显示文字 TRUEFALSE,则可以使用您建议的 case 语句。由于 PostgreSQL 将 TRUEtrueyesonyt1 视为 true,我将控制我希望输出的样子。

Where子句可以写成这样:

select * from tablename where active
--or--
select * from tablename where active = true

(我的建议和PostgreSQL一样——使用true)

在选择时,尽管可能会犹豫是否使用 case 语句,但我仍然建议您这样做以控制您的输出字符串文字。

您的查询将如下所示:

select 
  case when active = TRUE then 'TRUE' else 'FALSE' end as active_status,
  ...other columns...
from tablename
where active = TRUE;

SQLFiddle 示例:http://sqlfiddle.com/#!15/4764d/1

create table test (id int, fullname varchar(100), active boolean);
insert into test values (1, 'test1', FALSE), (2, 'test2', TRUE), (3, 'test3', TRUE);

select
  id,
  fullname,
  case when active = TRUE then 'TRUE' else 'FALSE' end as active_status
from test;

| id | fullname | active_status |
|----|----------|---------------|
|  1 |    test1 |         FALSE |
|  2 |    test2 |          TRUE |
|  3 |    test3 |          TRUE |

【讨论】:

  • 我不是 SQL 大师。我们可以记录一个 CASE 语句来完成答案,就像您在 SELECT 中显示的那样?我做了
  • 哦,是的,你打赌。我添加了一个示例
  • select *, CASE WHEN active IS TRUE THEN 'TRUE' ELSE 'FALSE' END from tablename(* 后面的逗号很重要)
  • 是的,你完全正确。 * 和大小写之间的逗号很重要。
  • 这个答案收到了反对票。很高兴知道原因以及可以改进的地方;我很乐意添加改进。
【解决方案2】:

简单地转换为text 就可以了(除非您需要大写拼写):

SELECT true::text AS t, false::text AS f;

 t    | f
------+-------
 true | false

否则,文本表示取决于您用于连接的库和客户端。例如,JDBC 将 boolean 值呈现为“真”/“假”:

db小提琴here
sqlfiddle

您会喜欢 Postgres 9.5 中的这种变化(引用 release notes):

  • 在 PL/pgSQL 中使用赋值强制转换行为进行数据类型转换 作业,而不是在文本之间进行转换 (Tom Lane)

此更改会导致 将布尔值转换为字符串以生成 truefalse,而不是tf。其他类型转换可能在更多情况下成功 比以前;例如,将数值 3.9 分配给整数 变量现在将分配 4 而不是失败。如果没有作业等级 cast 是为特定的源和目标类型定义的, PL/pgSQL 将回退到其旧的 I/O 转换行为。

我的大胆强调。

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 2020-06-23
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多