26

case今日、私はこの振る舞いに驚いた。

select case when null then true else false end;
 case 
------
 f

ブール値にキャストされたyeldsは:ではないnullので、それが戻ることを期待します。nullnullfalse

select null::boolean is null;
 ?column? 
----------
 t

この振る舞いの理論的根拠について何かコメントはありますか?私は何が欠けていますか?

4

6 に答える 6

46

次のようなものを使用します

case when p.parent_id is null then false else true end as has_parent
于 2014-07-10T22:38:03.297 に答える
37

あなたが(また)次のようなものが必要な場合

if column is null then 'value' 

使用する:

COALESCE(column_name, 'replacment for null value') as column_name

それでもcaseステートメントが必要な場合は、次を使用します。

case COALESCE(column_name, 'asdf') 
when 'asdf' then true
else false
end as desired_column_name
于 2015-08-17T14:12:17.643 に答える
16

CASE関数または演算子への入力としてasを受け取っているような式を考えています。nullここで、null入力は通常null出力になります。

regress=> SELECT 't'::boolean = NULL::boolean;
 bool 
------

(1 row)

実際にはWHERE、null処理の観点からは句のように動作します。

craig=> SELECT 't' WHERE NULL;
 ?column? 
----------
(0 rows)

WHERE節-およびでは、テスト式CASENULL結果は「真ではないため、偽」として扱われます。いくつかの点で、SQL標準が式のNULL結果WHEREをfalseとして扱うのではなくエラーにしないことは残念ですが、そのようになっています。

これは、のスプリットパーソナリティのさらに別の痛みを伴う症状であり、SQL仕様では、 sと集計のひどい混乱のように、「不明/未定義の値」または「値の欠如」のどちらを意味NULLするかを判断できません。NULLNULL

于 2013-03-14T23:52:07.643 に答える
5

'select'を使用して、DATA列のnullを確認できます。

select 
  ID,
  case (select 1 where DATA is null)
    when 1 then 'no data'
    else data
  end
from ...
于 2014-11-25T07:33:56.237 に答える
1

PostgreSQLのドキュメントに記載されているように:

WHEN条件が真でない場合、case式の値はELSE節の結果になります。ELSE句が省略され、条件が一致しない場合、結果はnullになります。

Postgresqlは出力をキャストせず、else条件があるため、を取得していますfalse。次のクエリはnull値を返します(else条件がないため)

select case when null then true end;
于 2013-03-14T18:39:05.610 に答える
1

あなたが書いたCASEステートメントには2つのブランチがあります。

1つwhen null then true、、は決して発生しません(nullと等しくないためtrue

そしてelseブランチ、それは通常のブランチに一致がないときに起こりwhenます。

例:

CASE WHEN val = 1 THEN 5
     WHEN val = 2 THEN 10
     ELSE 20 /*all other values, including null*/
END
于 2013-03-14T18:40:07.133 に答える