条件関数と式

引数の一つをif-else方式で評価して返す関数。

CASE

概要:

Sql

  1. CASE WHEN condition THEN result
  2. [WHEN ...]
  3. [ELSE default_result]
  4. END

入力:

一つまたは複数の WHEN condition THEN result 句が使用され、式にはオプションで ELSE default_result 句を含めることができます。すべての condition はブール式である必要があります。

出力: 対応する WHEN conditiontrue に評価される場合は result 式の一つ、すべての WHEN condition 句が false に評価される場合は default_result が返されます。オプションの ELSE default_result 句が欠落していて、すべての WHEN condition 句が false に評価される場合は null が返されます。

説明: CASE式は、他のプログラミング言語のif/else文をシミュレートする一般的な条件式です。条件の結果が真であれば、条件に続く結果式の値が返され、以降のwhen句はスキップされて処理されません。

Sql

  1. SELECT CASE WHEN 1 > 2 THEN 'elastic'
  2. WHEN 2 <= 3 THEN 'search'
  3. END AS "case";
  4. case
  5. ---------------
  6. search

Sql

  1. SELECT CASE WHEN 1 > 2 THEN 'elastic'
  2. WHEN 2 > 10 THEN 'search'
  3. END AS "case";
  4. case
  5. ---------------
  6. null

Sql

  1. SELECT CASE WHEN 1 > 2 THEN 'elastic'
  2. WHEN 2 > 10 THEN 'search'
  3. ELSE 'default'
  4. END AS "case";
  5. case
  6. ---------------
  7. default

バリアントとして、CASE式は他のプログラミング言語のswitch-caseに似た構文で表現できます:

Sql

  1. CASE expression
  2. WHEN value1 THEN result1
  3. [WHEN value2 THEN result2]
  4. [WHEN ...]
  5. [ELSE default_result]
  6. END

この場合、内部的に次のように変換されます:

Sql

  1. CASE WHEN expression = value1 THEN result1
  2. [WHEN expression = value2 THEN result2]
  3. [WHEN ...]
  4. [ELSE default_result]
  5. END

Sql

  1. SELECT CASE 5
  2. WHEN 1 THEN 'elastic'
  3. WHEN 2 THEN 'search'
  4. WHEN 5 THEN 'elasticsearch'
  5. END AS "case";
  6. case
  7. ---------------
  8. elasticsearch

Sql

  1. SELECT CASE 5
  2. WHEN 1 THEN 'elastic'
  3. WHEN 2 THEN 'search'
  4. WHEN 3 THEN 'elasticsearch'
  5. ELSE 'default'
  6. END AS "case";
  7. case
  8. ---------------
  9. default

すべての結果式は互換性のあるデータ型でなければなりません。より具体的には、すべての結果式は最初の非NULL結果式と互換性のあるデータ型である必要があります。例えば:

次のクエリの場合:

Sql

  1. CASE WHEN a = 1 THEN null
  2. WHEN a > 2 THEN 10
  3. WHEN a > 5 THEN 'foo'
  4. END

エラーメッセージが返され、fooがデータ型keywordであり、期待されるデータ型integer(結果10に基づく)と一致しないことが示されます。

条件バケット化

CASEは、クエリ内でGROUP BYキーとして使用され、カスタムバケットを作成し、それらのバケットに説明的な名前を割り当てることができます。例えば、キーの値が多すぎる場合や、単にその値の範囲が各値よりも興味深い場合、CASEは次の例のようにカスタムバケットを作成できます:

Sql

  1. SELECT count(*) AS count,
  2. CASE WHEN NVL(languages, 0) = 0 THEN 'zero'
  3. WHEN languages = 1 THEN 'one'
  4. WHEN languages = 2 THEN 'bilingual'
  5. WHEN languages = 3 THEN 'trilingual'
  6. ELSE 'multilingual'
  7. END as lang_skills
  8. FROM employees
  9. GROUP BY lang_skills
  10. ORDER BY lang_skills;

このクエリを使用すると、値0, 1, 2, 3の通常のグループ化バケットを説明的な名前で作成でき、すべての値*

= 4多言語*バケットに入ります。

COALESCE

概要:

Sql

  1. COALESCE(
  2. expression,
  3. expression,
  4. ...)

入力:

1番目の式
2番目の式

N番目の式

COALESCEは任意の数の引数を取ることができます。

出力: 式の一つまたは null

説明: NULLでない最初の引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT COALESCE(null, 'elastic', 'search') AS "coalesce";
  2. coalesce
  3. ---------------
  4. elastic

Sql

  1. SELECT COALESCE(null, null, null, null) AS "coalesce";
  2. coalesce
  3. ---------------
  4. null

GREATEST

概要:

Sql

  1. GREATEST(
  2. expression,
  3. expression,
  4. ...)

入力:

1番目の式
2番目の式

N番目の式

GREATESTは任意の数の引数を取ることができ、すべての引数は同じデータ型でなければなりません。

出力: 式の一つまたは null

説明: NULLでない最大の値を持つ引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT GREATEST(null, 1, 2) AS "greatest";
  2. greatest
  3. ---------------
  4. 2

Sql

  1. SELECT GREATEST(null, null, null, null) AS "greatest";
  2. greatest
  3. ---------------
  4. null

IFNULL

概要:

Sql

  1. IFNULL(
  2. expression,
  3. expression)

入力:

1番目の式
2番目の式

出力: 1番目の式がNULLの場合は2番目の式、それ以外は1番目の式。

説明: 引数が2つだけのCOALESCEのバリアント。NULLでない最初の引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT IFNULL('elastic', null) AS "ifnull";
  2. ifnull
  3. ---------------
  4. elastic

Sql

  1. SELECT IFNULL(null, 'search') AS "ifnull";
  2. ifnull
  3. ---------------
  4. search

IIF

概要:

Sql

  1. IIF(
  2. expression,
  3. expression,
  4. [expression])

入力:

評価するブール条件
ブール条件が true に評価される場合の戻り値
ブール条件が false に評価される場合の戻り値; オプション

出力: 1番目の式(条件)が true に評価される場合は2番目の式を返します。false に評価される場合は3番目の式を返します。3番目の式が提供されていない場合は null を返します。

説明: プログラミング言語の標準的なIF THEN ELSE ロジックを実装する条件関数です。3番目の式が提供されていない場合、条件が false に評価されると null が返されます。

Sql

  1. SELECT IIF(1 < 2, 'TRUE', 'FALSE') AS result1, IIF(1 > 2, 'TRUE', 'FALSE') AS result2;
  2. result1 | result2
  3. ---------------+---------------
  4. TRUE |FALSE

Sql

  1. SELECT IIF(1 < 2, 'TRUE') AS result1, IIF(1 > 2 , 'TRUE') AS result2;
  2. result1 | result2
  3. ---------------+---------------
  4. TRUE |null

IIF関数は、CASE式をシミュレートするために、より複雑なロジックを実装するために組み合わせることができます。例えば:

Sql

  1. IIF(a = 1, 'one', IIF(a = 2, 'two', IIF(a = 3, 'three', 'many')))

ISNULL

概要:

Sql

  1. ISNULL(
  2. expression,
  3. expression)

入力:

1番目の式
2番目の式

出力: 1番目の式がNULLの場合は2番目の式、それ以外は1番目の式。

説明: 引数が2つだけのCOALESCEのバリアント。NULLでない最初の引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT ISNULL('elastic', null) AS "isnull";
  2. isnull
  3. ---------------
  4. elastic

Sql

  1. SELECT ISNULL(null, 'search') AS "isnull";
  2. isnull
  3. ---------------
  4. search

LEAST

概要:

Sql

  1. LEAST(
  2. expression,
  3. expression,
  4. ...)

入力:

1番目の式
2番目の式

N番目の式

LEASTは任意の数の引数を取ることができ、すべての引数は同じデータ型でなければなりません。

出力: 式の一つまたは null

説明: NULLでない最小の値を持つ引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT LEAST(null, 2, 1) AS "least";
  2. least
  3. ---------------
  4. 1

Sql

  1. SELECT LEAST(null, null, null, null) AS "least";
  2. least
  3. ---------------
  4. null

NULLIF

概要:

Sql

  1. NULLIF(
  2. expression,
  3. expression)

入力:

1番目の式
2番目の式

出力: 2つの式が等しい場合は null、そうでなければ1番目の式を返します。

説明: 2つの入力式が等しい場合に null を返し、そうでない場合は1番目の式を返します。

Sql

  1. SELECT NULLIF('elastic', 'search') AS "nullif";
  2. nullif
  3. ---------------
  4. elastic

Sql

  1. SELECT NULLIF('elastic', 'elastic') AS "nullif";
  2. nullif:s
  3. ---------------
  4. null

NVL

概要:

Sql

  1. NVL(
  2. expression,
  3. expression)

入力:

1番目の式
2番目の式

出力: 1番目の式がNULLの場合は2番目の式、それ以外は1番目の式。

説明: 引数が2つだけのCOALESCEのバリアント。NULLでない最初の引数を返します。すべての引数がNULLの場合、nullを返します。

Sql

  1. SELECT NVL('elastic', null) AS "nvl";
  2. nvl
  3. ---------------
  4. elastic

Sql

  1. SELECT NVL(null, 'search') AS "nvl";
  2. nvl
  3. ---------------
  4. search