Возвращает логическое значение 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' в любом случае:
Вам понравится это изменение в Postgres 9.5 (в настоящее время релиз-кандидат):
использовать поведение приведения назначения для преобразования типов данных в PL/pgSQL назначения, а не преобразование в текст и из текста (Tom Lane)
это изменение вызывает преобразования логических значений в строки для получения
true
илиfalse
, а неt
илиf
. Другие преобразования типов могут быть успешными в большем числе случаев чем раньше; например, присвоение числового значения3.9
в целое число переменная теперь будет присваивать4
вместо того, чтобы потерпеть неудачу. Если нет присвоения-класс бросать определяется для конкретных типов источника и назначения, PL/pgSQL вернется к своему старому поведению преобразования ввода-вывода.
жирным выделено мной.