Возвращает логическое значение TRUE или FALSE в Select (PostgreSQL/pgAdmin)

в PostgreSQL (версия 9.4, pgAdmin3) при выборе в таблице с логическим столбцом вывод данных показывает " t " или "f". Я хотел бы привести / преобразовать логические значения как TRUE или FALSE без написания операторов CASE или выполнения соединений и т. д.

BTW, согласно PostgreSQL own документация это поведение не является стандартом SQL.

ключевые слова TRUE и FALSE являются предпочтительным (SQL-совместимым) использованием.

PS: Это происходит только при использовании редактора SQL в pgAdmin. Используйте браузер объектов pgAdmin, перейдите к той же таблице, щелкните правой кнопкой мыши, просмотрите данные, просмотрите верхние 100 строк, тот же логический столбец отображается как TRUE или FALSE, как ожидалось/стандарт.

2 ответов


если все, что вы хотите показать буквальный TRUE или FALSE, вы можете использовать заявления case, как вы предложили. Так как PostgreSQL лечит TRUE, true, yes, on, y, t и 1 как true, я бы контролировал, как я хочу, чтобы выход выглядел.

где предложение может быть написано как:

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

(моя рекомендация такая же, как PostgreSQL - использовать true)

при выборе, хотя могут быть сомнения в использовании операторы case, я бы все равно рекомендовал сделать это, чтобы иметь контроль над вашим выходным строковым литералом.

ваш запрос будет выглядеть следующим образом:

select 
  case 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 |

простой бросок в text сделает работу (если вам не нужно правописание верхнего регистра):

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

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

в противном случае текстовое представление зависит от библиотеки и клиента, которые вы используете для подключения. Например, JDBC отображает boolean значения как 'true' / 'false' в любом случае:

SQL Fiddle.

Вам понравится это изменение в Postgres 9.5 (в настоящее время релиз-кандидат):

  • использовать поведение приведения назначения для преобразования типов данных в PL/pgSQL назначения, а не преобразование в текст и из текста (Tom Lane)

    это изменение вызывает преобразования логических значений в строки для получения true или false, а не t или f. Другие преобразования типов могут быть успешными в большем числе случаев чем раньше; например, присвоение числового значения 3.9 в целое число переменная теперь будет присваивать 4 вместо того, чтобы потерпеть неудачу. Если нет присвоения-класс бросать определяется для конкретных типов источника и назначения, PL/pgSQL вернется к своему старому поведению преобразования ввода-вывода.

жирным выделено мной.