Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CASE

何らかの条件に従って、特定の値の組み合わせを選択します。

Synopsis

CASE 
  WHEN search_condition THEN value_expression
  [ WHEN search_condition THEN value_expression ... ]
  [ ELSE value_expression ]
END

CASE value_expression
  WHEN value_expression THEN value_expression
  [ WHEN value_expression THEN value_expression ... ]
  [ ELSE value_expression ]
END

引数

search_condition SQL ブーリアン式。
value_expression SQL 式 (リテラル値やフィールド名など)。

概要

CASE 式を使用すると、一連の値に対する比較テストを実行し、最初に値が一致したときに返り値を得ることができます。

CASE 式には単純と検索の 2 つの形式があります。

単純 CASE 式は、(WHEN 節で指定した) 一連の値式をテストし、与えられた値式と等しいかどうかを調べます。

SELECT
CASE Field1
  WHEN 1 THEN 'ONE'
  WHEN 2 THEN 'TWO'
  ELSE NULL
END
FROM MyTable

最初に一致する式に対応する値が CASE 式の値として返されます。

数値の value_expression 値には、さまざまな複数のデータ型を使用できます。返されるデータ型は、考えられるすべての結果値との互換性が最も高く、データ型の優先順位が最も高いデータ型です。value_expression 値が数値の場合、CASE は可能なすべての結果値の中から、最大の長さ、有効桁数、および小数桁数を返します。NULL の結果値はデータ型の優先順位が最下位になりますが、すべての結果値が NULL の場合、返されるデータ型は VARCHAR です。

検索 CASE 式は、(WHEN 節で指定した) 一連の検索条件をテストし、評価が True になる最初の WHEN 条件を検索し、対応する値を返します。

SELECT
CASE
  WHEN Field1 = 1 THEN 'ONE'
  WHEN Field1 = 2 THEN 'TWO'
  ELSE NULL
END
FROM MyTable

どちらの CASE 式の形式でも、WHEN 節の条件が True でない場合に返す値を ELSE 節で指定できます。ELSE 節を省略した際に、どの WHEN 節の条件も True にならない場合、CASE は NULL を返します。

CASE の NULL の比較テストには、IS NULL または IS NOT NULL のいずれかのキーワード句を使用する必要があります。NULL はデータ値ではありません (値が存在しないことを示します)。そのため、NULL の等式テストまたは算術テストは常に False を返します。NULL と任意のデータ値を比較する CASE 式は常に False を返します。例えば、NULL < 1 と NULL > 1 は両方とも False を返します。NULL どうしを比較する CASE 式も常に False を返します。

CASE 式の最後には END トークンを記述します。

GREATEST および LEAST 関数を使用して、指定された値の最大値または最小値 (最高または最低を照合) を一連の値から返します。

以下のクエリは単純 CASE 式の例で、ここでは指定したフィールドの値を指定した値に置き換えます。END キーワードの後に列のエイリアス RetireAge を記述しています。また、オプションの AS キーワードは省略しています。

SELECT Name,
CASE Age
  WHEN 65 THEN 'Retire this year'
  WHEN 64 THEN 'Retire next year' 
  ELSE 'Past retirement age '|| Age
END RetireAge
FROM Sample.Person
WHERE Age > 63
ORDER BY Age

以下のクエリは、別の単純 CASE 式の例です。このクエリでは、特定の Home_State 値を持つ行に "Northern NE" または "Southern NE" のラベルを付け、この列のその他の Home_State 値を NULL に設定します。さらに、As 節を使用してこの列に "NewEnglanders" のラベルを付け、Name と元の Home_State 値を表示します。この結果得られる行は、まず NewEnglanders 列の値の降順で並べられ、その中で Home_State、Name の順でアルファベット順に並べられます。

SELECT Name,
CASE Home_State
  WHEN 'VT' THEN 'Northern NE'
  WHEN 'NH' THEN 'Northern NE'
  WHEN 'ME' THEN 'Northern NE'
  WHEN 'MA' THEN 'Southern NE'
  WHEN 'CT' THEN 'Southern NE'
  WHEN 'RI' THEN 'Southern NE'
  ELSE NULL
END AS NewEnglanders, Home_State
FROM Sample.Person
ORDER BY NewEnglanders DESC,Home_State,Name

以下のクエリは、検索 CASE 式の例です。ここでは、論理演算子 (不等号 >、論理積 &、論理和 !) を使用して、WHEN 節ごとにブーリアン文を指定します。True をテストする最初の WHEN 節によって、THEN キーワードに続く値式が設定されます。この例では、Age フィールドと Home_State フィールドの値を使用して、Yankees の値を、Old Yankees、Yankees (New England の 6 州の住民)、および野球チーム New York Yankees のファンと思われる人のいずれかに特定します。

SELECT Name,
CASE
WHEN Age > 55 & Home_State = 'VT' 
   ! Home_State='ME' ! Home_State='NH'
   ! Home_State='MA' ! Home_State='CT'
   ! Home_State='RI'
THEN 'Old Yankee'
WHEN Home_State = 'VT' 
   ! Home_State='ME' ! Home_State='NH'
   ! Home_State='MA' ! Home_State='CT'
   ! Home_State='RI'
THEN 'Yankee'
WHEN Home_State='NY' THEN 'Yankees Fan'
   ELSE Home_State
END AS Yankees
FROM Sample.Person

以下の例では、どのような値と NULL を比較しても必ず False が返されることを示しています。

SELECT TOP 5 Name,
CASE NULL
  WHEN NULL THEN 'Null = Null'
  WHEN 0 THEN 'Null = 0'
  WHEN '' THEN 'Null = empty string'
  WHEN CHAR(0) THEN 'Null = CHAR(0)'
  ELSE 'Null Arithmetic Invalid'
END
FROM Sample.Person

以下の例は、NULL を持つフィールドで CASE を使用する方法を示しています。

SELECT TOP 20 Name,
CASE
  WHEN FavoriteColors IS NULL THEN 'No Colors'
  ELSE $LISTTOSTRING(FavoriteColors,':')
END
FROM Sample.Person

以下の例のように、CASE はクエリでの使用に限定されません。

  ZNSPACE "SAMPLES"
  SET myin=3
  SET myin(1) = "INSERT INTO SQLUser.MyStudents (Name,PxTs) VALUES "
  SET myin(2) = "(CASE ? WHEN 'a' THEN 'Alice' WHEN 'b' THEN 'Barney' ELSE 'Unknown' END,"
  SET myin(3) = "CURRENT_TIMESTAMP)"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(.myin)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute("a")
  DO rset.%Display()

関連項目

FeedbackOpens in a new tab