Вывод «да/нет» вместо «t/f» для булева типа данных в PostgreSQL

Вопрос:Как сделать запрос, который вернет yes/no вместо t/f (true/false)? Текущее решение: SELECT credit_card_holders.token IS NOT NULL AS premium Я нашел решение Ruby: Rails (или Ruby): Да/Нет вместо True/False Но скорее сделайте это в PostgreSQL, если это возможно. Ответ №1Закончено с этим: (case when credit_card_holders.token IS NOT NULL then 'Yes' else 'No' end) AS premium Ответ

Вопрос:

Как сделать запрос, который вернет yes/no вместо t/f (true/false)?

Текущее решение:

SELECT credit_card_holders.token IS NOT NULL AS premium

Я нашел решение Ruby:
Rails (или Ruby): Да/Нет вместо True/False

Но скорее сделайте это в PostgreSQL, если это возможно.

Ответ №1

Закончено с этим:

(case when credit_card_holders.token IS NOT NULL then ‘Yes’ else ‘No’ end) AS premium Ответ №2

создавая настраиваемые типы, вы также можете это сделать, см. следующий пример

create table foo (id int,xid int); insert into foo values (1,2),(2,3);

мы имеем следующие данные

id xid — — 1 2 2 3

и следующие операторы select возвращают значение boolean.

select exists(select * from foo where xid=4); exists boolean —— f select exists(select * from foo where xid=3); exists boolean —— t

ok теперь нам нужно вернуть YES и NO вместо t и f, поэтому мы можем создать настраиваемый тип, например ниже

create type bool2yesno as enum (‘YES’,’NO’); —or whatever you want ‘yes’,’no’.

и создать функцию для преобразования boolean в созданный пользовательский тип i.e bool2yesno

create function convert_bool_to_bool2yesno(boolean) returns bool2yesno immutable strict language sql as $func$ select case $1 when false then ‘NO’::bool2yesno when true then ‘YES’::bool2yesno end $$;

теперь создайте cast для вновь созданного типа

create cast (boolean as bool2yesno ) with function convert_bool_to_bool2yesno(boolean) as assignment;

теперь снова попробуйте оператор select

select exists(select * from foo where xid=4)::bool2yesno ; exists bool2yesno ———- NO select exists(select * from foo where xid=3)::bool2yesno ; exists bool2yesno ———- YES

Справка:
СОЗДАТЬ ТИП
CREATE CAST
CREATE FUNCTION

Ответ №3

Самый простой способ в случае, если true/false достаточно хорош:

SELECT (credit_card_holders.token IS NOT NULL)::text AS premium

По крайней мере, это более читаемо, чем t/f!

Ответ №4

С помощью этого драгоценного камня humanize_boolean вы можете сделать это

true.humanize # => «Yes»
false.humanize # => «No»

Оцените статью
Добавить комментарий