条件に基づいて値を割り当て
Data Shaping Languageを使い、条件に応じた値を持つレコードを生成します。
このタスクについて
この例では、以下のJSON入力を使います。これには、各顧客のID、名前、住所、評価が含まれているcustomer配列が含まれています。
この変換の目的は、nameエレメントとinfoエレメントを持つ顧客の配列を返すことです。infoの値はratingの値によって変化します。
- 顧客に評価がない場合、infoは値が'No info'である文字列となります。
- 顧客の評価が0〜600の場合、infoは、値がStandardであるcategoryエレメントと顧客の都市が含まれているオブジェクトとなります。
- それ以外の場合、infoには、値がGoldであるcategoryエレメントと顧客の完全アドレスが含まれます。
{ "customer": [ { "custid": "C13", "name": "T. Cruise", "address": { "street": "201 Main St.", "city": "St. Louis, MO", "zipcode": "63101" }, "rating": 750 }, { "custid": "C25", "name": "M. Streep", "address": { "street": "690 River St.", "city": "Hanover, MA", "zipcode": "02340" }, "rating": 690 }, { "custid": "C31", "name": "B. Pitt", "address": { "street": "360 Mountain Ave.", "city": "St. Louis, MO", "zipcode": "63101" } }, { "custid": "C35", "name": "J. Roberts", "address": { "street": "420 Green St.", "city": "Boston, MA", "zipcode": "02115" }, "rating": 565 }, { "custid": "C37", "name": "T. Hanks", "address": { "street": "120 Harbor Blvd.", "city": "Boston, MA", "zipcode": "02115" }, "rating": 750 }, { "custid": "C41", "name": "R. Duvall", "address": { "street": "150 Market St.", "city": "St. Louis, MO", "zipcode": "63101" }, "rating": 640 }, { "custid": "C47", "name": "S. Loren", "address": { "street": "Via del Corso", "city": "Rome, Italy" }, "rating": 625 } ] }
手順
- customer配列を呼び出すFROM customer句を作成します。
- 入力nameとinfoという新しいエレメントを返すSELECT句を作成します。
-
infoの値として使用する条件式を定義します。
- 顧客に評価がない場合は、infoの値を'No info'に設定します。その結果、IF (rating == null) 'No info'となります。
- ratingの値が0~600の場合は、infoの値を、値が'Standard'であるcategoryエレメントと顧客の都市を持つオブジェクトに設定します。その結果、ELSEIF rating BETWEEN 0 AND 600 { category = 'Standard', city = address.city }となります。
- その他の場合は、infoの値を、値が'Gold'であるcategoryエレメントと顧客の完全アドレスを持ち、1つの文字列に連結されているオブジェクトに設定します。その結果、ELSE { category = 'Gold', address = concatWith(', ', address.street, address.city) }となります。
タスクの結果
クエリーは次のようになります:
FROM customer
SELECT {
name,
info =
IF (rating == null)
'No info'
ELSEIF rating BETWEEN 0 AND 600 {
category = 'Standard',
city = address.city
}
ELSE {
category = 'Gold',
address = concatWith(', ', address.street, address.city)
}
}
以下の結果が返されます:
[
{
"name": "T. Cruise",
"info": {
"category": "Gold",
"address": "201 Main St., St. Louis, MO"
}
},
{
"name": "M. Streep",
"info": {
"category": "Gold",
"address": "690 River St., Hanover, MA"
}
},
{
"name": "B. Pitt",
"info": "No info"
},
{
"name": "J. Roberts",
"info": {
"category": "Standard",
"city": "Boston, MA"
}
},
{
"name": "T. Hanks",
"info": {
"category": "Gold",
"address": "120 Harbor Blvd., Boston, MA"
}
},
{
"name": "R. Duvall",
"info": {
"category": "Gold",
"address": "150 Market St., St. Louis, MO"
}
},
{
"name": "S. Loren",
"info": {
"category": "Gold",
"address": "Via del Corso, Rome, Italy"
}
}
]