web-dev-qa-db-ja.com

Selectでブール値をTRUEまたはFALSEとして返す(PostgreSQL / pgAdmin)

PostgreSQL(バージョン9.4、pgAdmin3)では、ブール列のあるテーブルでselectを実行すると、データ出力に「t」または「f」が表示されます。 CASEステートメントを記述したり、JOINSを実行したりすることなく、ブール値をTRUEまたはFALSEとしてキャスト/変換したいと思います。

ところで、PostgreSQL独自の ドキュメント によると、この動作はSQL標準ではありません。

キーワードTRUEおよびFALSEは、優先される(SQL準拠の)使用法です。

PS:これは、pgAdminでSQLエディターを使用している場合にのみ発生します。 pgAdminオブジェクトブラウザを使用し、同じテーブルにドリルダウンし、右クリックしてデータを表示し、上位100行を表示すると、同じブール列が期待値/標準としてTRUEまたはFALSEとして表示されます。

14
Net Dawg

表示するのがリテラルTRUEまたはFALSEだけである場合は、提案したようなcaseステートメントを使用できます。 PostgreSQLはTRUEtrueyesonytおよび1 trueの場合、出力をどのように表示するかを制御します。

Where句は次のように記述できます。

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 |
18
zedfoxus

textへの単純なキャストは仕事をします(大文字のスペルが必要でない限り):

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

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

それ以外の場合、テキスト表現は、接続に使用するライブラリとクライアントに依存します。インスタンスのJDBCは、boolean値を「true」/「false」としてレンダリングします:

SQL Fiddle。

Postgres9.5リリースノート を引用)でこの変更を気に入るはずです:

  • テキストとの間で変換するのではなく、PL/pgSQL割り当てのデータ型変換に割り当てキャスト動作を使用します(Tom Lane)

    この変更により、ブール値の文字列への変換により、trueまたはfalseではなくtまたはfが生成されます 。他の型変換は、以前よりも多くの場合に成功する可能性があります。たとえば、数値3.9を整数変数に割り当てると、失敗するのではなく4が割り当てられるようになりました。特定のソースおよびデスティネーションタイプに割り当てグレードのキャストが定義されていない場合、PL/pgSQLは以前のI/O変換動作にフォールバックします。

大胆な強調鉱山。

11