Returnarea valorii booleene ca TRUE sau FALSE în Select (PostgreSQL/pgAdmin) (Programare, Sql, Postgresql, Boolean)

Net Dawg a intrebat.

În PostgreSQL (versiunea 9.4, pgAdmin3), atunci când se face un select pe o tabelă cu coloană booleană, ieșirea datelor afișează ‘t’ sau ‘f’. Aș dori să arunc/convertesc booleenii ca TRUE sau FALSE fără a scrie declarații CASE sau a face JOINS etc.

BTW, conform propriului PostgreSQL acest comportament nu reprezintă standardul SQL.

Cuvintele cheie TRUE și FALSE reprezintă utilizarea preferată (conformă cu SQL).

PS: Acest lucru se întâmplă numai atunci când se utilizează editorul SQL din pgAdmin. Utilizați browserul de obiecte pgAdmin, faceți drill down la aceeași tabelă, faceți clic dreapta, vizualizați datele, Vizualizați primele 100 de rânduri, aceeași coloană booleană apare ca TRUE sau FALSE, așa cum era de așteptat/standard.

Comentarii

  • Dacă se afișează ca „t”/”f” sau „TRUE”/”FALSE” este pur și simplu o problemă de afișare. Booleanul returnează valoarea TRUE sau FALSE (atenție, fără ghilimele). Modul în care aceasta este reprezentată pe ecran depinde de software-ul respectiv. Vă sugerez cu tărie să nu încercați să returnați o valoare de șir de caractere pentru a evita o problemă de afișare. –  > Por Tom H.
  • Corect – este doar o problemă cosmetică. Am adăugat pgAdmin la titlul întrebării mele pentru a clarifica. De asemenea, afișarea este în mod specific în editorul SQL pgAdmin. Deci, cred că este doar o cerere de îmbunătățire în următoarea versiune a pgAdmin – pentru a fi în concordanță cu propria documentație și cu standardul SQL 😉 –  > Por Net Dawg.
2 răspunsuri
zedfoxus

Dacă tot ce doriți să arătați este literalul TRUE sau FALSE, , poți folosi declarațiile case așa cum ai propus. Deoarece PostgreSQL tratează TRUE, , true, , yes, , on, , y, , t și 1 ca fiind adevărate, aș controla modul în care aș dori să arate rezultatul.

Clauza Where poate fi scrisă în felul următor:

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

(Recomandarea mea este aceeași ca și în PostgreSQL – folosiți true)

La selectare, deși ar putea exista o ezitare în a utiliza declarațiile case, aș recomanda totuși să faceți acest lucru pentru a avea control asupra șirului literal de ieșire.

Interogarea dvs. ar arăta astfel:

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

Exemplu 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 |

Comentarii

  • Nu sunt un guru SQL. Putem documenta o instrucțiune CASE pentru a completa răspunsul, așa cum ați arătat cu SELECT? Am făcut –  > Por Net Dawg.
  • Oh, da, sigur că da. Am adăugat un exemplu –  > Por zedfoxus.
  • select *, CASE WHEN active IS TRUE THEN ‘TRUE’ ELSE ‘FALSE’ END from tablename (virgula de după * este importantă) –  > Por Net Dawg.
  • Da, aveți perfectă dreptate. Acea virgulă dintre * și case este importantă. –  > Por zedfoxus.
  • Acest răspuns a primit un downvote. Ar fi frumos să știți de ce și ce poate fi îmbunătățit; aș fi bucuros să adaug îmbunătățiri. –  > Por zedfoxus.
Erwin Brandstetter

O distribuție simplă pentru text va face treaba (cu excepția cazului în care aveți nevoie de scrierea cu majuscule):

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

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

În rest, reprezentarea textului depinde de biblioteca și de clientul pe care îl utilizați pentru a vă conecta. JDBC, de exemplu, redă boolean valorile ca „true” / „false”:

SQL Fiddle.

Vă va plăcea această schimbare în Postgres 9.5 (citând note de lansare):

  • Utilizați comportamentul de distribuire a atribuțiilor pentru conversiile de tip de date în atribuțiile PL/pgSQL, mai degrabă decât conversia în și din text (Tom Lane).

    Această modificare determină conversiile de booleeni în șiruri de caractere să producă true sau false, , nu t sau f. Alte conversii de tip pot avea succes în mai multe cazuri decât înainte; de exemplu, atribuirea unei valori numerice 3.9 la o variabilă de tip întreg va atribui acum 4 în loc să eșueze. În cazul în care nu se definește nicio cast de atribuire pentru tipurile sursă și destinație, PL/pgSQL va reveni la vechiul său comportament de conversie I/O.

Accentuarea boldurilor îmi aparține.