- 印刷する
- PDF
ルールクエリの作成
- 印刷する
- PDF
Classic/VPC環境で利用できます。
ルールクエリの作成ルールおよびルールクエリの作成時に使用できる組み込み関数の説明をします。
ルールクエリ作成のルール
IoT機器から送信されたメッセージの内容に、特定のルールクエリを作成します。ルールクエリを作成するには、基本的な SQL構文を理解している必要があります。また、SELECT構文だけをサポーしているため、SELECT - FROM - WHEREの順に作成する必要があります。
ルールクエリ作成のルールは、次の通りです。
SELECT [<トピック Alias>.<メッセージ JSON Key1>, <トピック Alias>.<メッセージ JSON Key2>, ...] FROM "[トピック]" AS [トピック Alias] WHERE [条件]
ルールクエリ作成の例は、次の通りです。
例1)
メッセージ構造
{ "deviceId": "1", "deviceType": "illumination", "buildingId": "N1001", "roomId": "001", "light": 75, "battery": 3.3, "eventTime": "2020-01-01 00:00:00" }
照明の明るさが 50lux未満であるデータのメッセージ内の全フィールドを抽出するクエリ
SELECT * FROM "apt/+/sensor/light" AS t WHERE t.light < 50
特定の建物の照明の明るさが50lux未満であるデータのメッセージ内の特定フィールドのみを抽出するクエリ
SELECT t.light, t.buildingId, t.roomId, t.eventTime FROM "apt/#" AS t WHERE t.buildingId = 'N1001' AND t.light < 50
例2)
メッセージ構造
{ "deviceId": "device_1", "deviceType": "temperature", "value": 35, "battery": 9, "date": "2016-12-15", "time": "15:12:00" }
battery値の残量が10%未満の場合を検査するためのクエリ
SELECT * FROM "factory/room1/temperature" AS t WHERE t.battery < 10
機器を区分することができる機器の ID値(deviceId)、バッテリー値(battery)のように特定のフィーのみを抽出するクエリ
SELECT t.deviceId, t.battery FROM "factory/room1/temperature" AS t WHERE t.battery < 10
ルールクエリ FROMのトピックの最大長さは255Byte(UTF-8 エンコーディング)であり、7段階まで使用できます。
SELECT/WHERE節
SELECT/WHEREに関しての詳細は、次の通りです。
- 一般的な SQLクエリと同様に作成でき、SELECT * FROM ...のように *(アスタリスク)の使用ができます。
- GROUP BY、ORDER BY、DISTINCT、JOIN、UNION、UNION ALL、INTERSECT、LIMITなど複数のデータを処理するクエリはサポートしていません。
- SUBQUERYはサポートしていません。
- MQTTに送信した JSONメッセージの Key(ex: light, buildingId、...)を使用して特定の Keyに対応する値をクエリ結果として選択することができます。
- 組み込み関数または算術演算式など、JSONフィールド Keyをそのまま使用しない場合、Aliasを使用して、結果の値として使用する JSONフィールド Keyを指定することをお勧めします。Aliasがない場合、クエリの結果の JSONフィールド Keyは、SELECT節での位置に基づき _1, _2, ..., _nのように出力されます。
例)
クエリ
SELECT t.productId, t.weight AS gram, t.weight / 1000.0, t.weight * 0.0352, t.weight / 1000.0 AS kg, t.weight * 0.0352 AS oz FROM "scm/warehouse/001" AS t
結果、
t.weight / 1000.0
とt.weight * 0.0352
には Aliasがないので、SELECT節の3番目の位置は'_3'、4番目の位置は'_4'で表示されます。{ "productId":"23", "gram":1500, "_3":1.5, "_4":52.8, "kg":1.5, "oz":52.8 }
Cloud IoT Coreでサポートされているルールクエリ組み込み関数については、ルールクエリ組み込み関数をご参照ください。
FROM節
FROM節の詳細は、次の通りです。
- 1つの MQTTトピックのみ可能です。
- トピック名の最大文字数は255文字です。
- "(Double Quotes)を利用して、トピックを括って表現しなければなりません。
- SELECTまたは WHERE節に、トピック名と同じ JSONフィールド Keyがある場合、トピックは必ず Alias(別名)を指定しなければならず、[トピック Alias].[JSONフィールド Key]の形式で作成する必要があります。
- トピックのレベルは、/(スラッシュ)で区切らなければなりません。
- トピックは、英文字、数字、空白、!@$%^&()_-={[}]?></`'の文字が可能です。
- .(ピリオド)、*(アスタリスク)、"(Double Quotes)はトピックに含めることができません。
- トピックは、/または//にはなり得ません。
- マルチレベルのワイルドカード#(ハッシュタグ)は、最終的なレベルでのみ使用できます。
- 単一レベルのワイルドカード+(プラス)は、最終的なレベルで使用できます。
- ワイルドカードは、該当レベルで単独で使用され、他の文字と一緒に使用できません。
- ルールに既に登録されているメッセージ再発行アクションがある場合、メッセージの再発行アクションによって、再度ルールクエリになり得るトピックでの設定はできません。
文字列
関数、比較文などの文字列を使用する場合、'(Single Quote)で括らなければなりません。
例) JSONメッセージの deviceTypeフィールドの値と文字列の sensor比較
SELECT * FROM "factory/room1/temparature" WHERE deviceType = 'sensor'
JSONフィールド Key
クエリで JSONフィールド Keyを使用しますが、入力メッセージに該当する JSONフィールド Keyがない場合は、クエリエラーが発生します。クエリエラーはエラーアクションで確認できます。
例) JSONメッセージの device、voltフィールドの値がないエラーが発生
SELECT device FROM "factory/room1/temparature" WHERE volt = 1.5
{
"lux": 1
}
"(Double Qutoes) を利用して、JSONフィールド Keyを使用していることを明確に表示できます。次のような場合、必ずフィールド Keyを "(Double Qutoes) で括る必要があります。
JSONフィールド Keyの大文字と小文字を区別する必要がある場合で JSONメッセージが次のような場合、クエリでは deviceTypeは大文字小文字を区別しないので、"(Double Qutoes) で括らないとき、どの JSONフィールド Keyを選択すべきか不明なためにエラーが発生します。
{ "deviceType": 10,"DEVICEType": 5 }
SELECT deviceType FROM "factory/room1/temparature" WHERE deviceType = 10
Multiple matches were found for the specified identifier Evaluator Error
JSONフィールド Keyが Keywordとして使用される単語である場合、ルールクエリ検証時に JSONフィールド Keyがクエリ文で使用できない予約された Keywordと同じであれば、次のようなエラーが発生します。Keywordと同じ JSONフィールド Keyを使用するためには、"(Double Quotes) で括って JSONフィールド Keyであることを明示しなければなりません。
Unexpected keyword
timeはクエリ文で Keywordなので、「time」 JSONフィールドキーを使用するために「time」を使用します。
SELECT "time" FROM "factory/room1/temparature"
JSONフィールド Keyに .(ピリオド)が含まれている場合、または特殊文字を含む JSONフィールド Keyの場合、ルールクエリでフィールドの .(ピリオド)は JSONメッセージ内でのネストフィールドを意味します。JSONフィール ド Keyに「.」(ピリオド)が含まれている場合、"(Double Quotes) で括ってフィールド Key値の特殊文字として処理できます。
例)
- メッセージの内容
{ "deviceId": "1", "deviceType": "sensor", "temperature": 21.3, "device.serialNo": 100001, "manufacture": { "company": "myCompany", "buildDate": "2020-01-01" } }
- ネストフィールドの照会
SELECT manufacture.company FROM "factory/room1/temparature"
- (ピリオド)が含まれているフィールドの照会
SELECT "device.serialNo" FROM "factory/room1/temparature"
- 特殊文字を含む JSONフィールド Keyがある場合
SELECT * FROM "factory/room1/temparature" WHERE "deviceType@number" = "sensor"
ルールクエリの組み込み関数
ルールクエリを作成する際に便利に使用できる組み込み関数について説明します。組み込み関数の名前は、大文字小文字に関係なく入力できます。組み込み関数は、Alias(別名)を使用してクエリ結果値である JSONの Key値として明確に表示することをお勧めします。「関数名(入力引数)」を入力すると、値が返されます。戻り値の型は、Number(整数または小数)、Integer(整数)、String(文字列)、Bool(真、偽の論理値)、Any(タイプどれでも)
作成例は次の通りです。
SELECT ABS(volt) AS volt FROM "topic"
- 次の各組み込み関数の例で、入力引数は定数値を入力しましたが、入力 JSONメッセージの Key値を入力すると JSON Valueが評価されます。
- 組み込み関数の引数値は、定数も入力できます。定数値の Stringの場合、'(Single Quote).で括り、bool値は、true、falseで、JSON値は`(Grave Accent)で括って入力します。
- 組み込み関数の入力引数の数が異なる場合や入力引数の型が異なる場合は、クエリが失敗します。エラーアクションを追加すると、クエリが失敗した理由を確認できます。
ABS
絶対値を返します。
- 構文
ABS(Number)=Number
- 例
ABS(-10)=10
SIGN
符号を返します。符号が + であれば1、- であれば-1、ゼロの場合は0を返します。
- 構文
SIGN(Number)=Number
- 例
SIGN(-5)=-1, SIGN(5)=1, SIGN(0)=0
CEIL
最も近い整数に切り上げた値を返します。
- 構文
CEIL(Number)=Integer
- 例
CEIL(1.1)=2, CEIL(-1.1)=-1
FLOOR
最も近い整数に切り捨てた値を返します。
- 構文
FLOOR(Number)=Integer
- 例
FLOOR(1.8)=1, FLOOR(-1.8)=-2
ROUND
最も近い整数に四捨五入した値を返します。
- 構文
ROUND(Number)=Integer
- 例
ROUND(0.5)=1, ROUND(-1.5)=-2
TRUNC
2番目の引数の数で小数点を切り捨てた値を返します。2番目の引数が負の場合は0、小数の場合は小数の部分を切り捨てて2番目の引数が置き換えられます。
- 構文
TRUNC(Number, Number)=Number
- 例
TRUNC(3.3, 0)=3, TRUNC(3.33312, 2)=3.33, TRUNC(3.000, 2)=3, TRUNC(2.23, -2)=2, TRUNC(2.23, 1.5)=2.2
MOD
最初の引数を2番目の引数で割った余りを返します。% 演算子を代わりに使用できます。
- 構文
MOD(Integer, Integer)=Integer
- 例
MOD(5, 2)=1
SQRT
数字の平方根を返します。
- 構文
SQRT(Number)=Number
- 例
SQRT(1.44)=1.2
POWER
最初の引数を2番目の引数で累乗した結果を返します。
- 構文
POWER(Number, Number)=Number
- 例
POWER(2, 4)=16
LOG
最初の引数の値を2番目の引数の値を下(Base)にして Log値を返します。最初の引数が0の場合、-inf
Stringを、0より小さい場合はnan
Stringを返します。2番目の引数が0より小さいか1の場合はnan
Stringを返します。
- 構文
LOG(Number, Number)=Number
- 例
LOG(100, 10)=2
EXP
e(自然定数、オイラー定数)で入力された数値の累乗値を返します。
- 構文
EXP(Number)=Number
- 例
EXP(1)=2.718281828459045
LN
e(自然定数、オイラー定数)を下(Base)にして、入力された数値の Log値を返します。数字が0より小さければnan
、0ならば-inf
Stringを返します。
- 構文
LN(Number)=Number
- 例
LN(10)=2.302585092994046
三角関数
三角関数の値を返します。使用可能な三角関数は、SIN(n)、SINH(n) COS(n)、COSH(n)、TAN(n)、TANH(n)、ASIN(n)、ACOS(n)、ATAN(n)、ATAN2(n)、ATANH(n)です。
- 構文
三角関数(Number)=Number
BITOR
2つの値を bit値に変換して、OR演算した値を10進数で返します。
- 構文
BITOR(Integer, Integer)=Integer
- 例
BITOR(4, 2)=6
BITAND
2つの値を bit値に変換して、AND演算した値を10進数で返します。
- 構文
BITAND(Integer, Integer)=Integer
- 例
BITAND(4, 2)=0
BITXOR
2つの値を bit値に変換して、XOR演算した値を10進数で返します。
- 構文
BITXOR(Integer, Integer)=Integer
- 例
BITXOR(5, 1)=4
NANVL
最初の引数が数字なら最初の引数を、数字でなければ2番目の引数を返します。
- 構文
NANVL(Any, Any)=Any
- 例
NANVL(1.1, 1.5)=1.1, NANVL('STRING', '3')="3"
ISNULL
値が null値の場合は真(true)、そうでない場合は偽(false)値で返します。
- 構文
ISNULL(Any)=Bool
- 例
ISNULL("not null")=false, ISNULL(null)=true
NULLIF
入力された2つの引数の値が同じであれば null、異なる場合、最初の引数の値を返します。
- 構文
NULLIF(Any, Any)=Any
- 例1
NULLIF(1, 1)=null
- 例2 deviceIdの値が nullであれば nullを、そうでなければ deviceIdの値を返す
NULLIF(deviceId, null)
- 例3
SELECT NULLIF(deviceId, null) AS deviceId FROM "topic" WHERE member IS NOT NULL
- 例4
SELECT NULLIF(deviceId, '2x33sed') AS deviceId FROM "topic"
EXISTS
JSON listまたは JSON objectのアイテムが存在するか確認します。存在する場合は真(true)、そうでない場合は偽(false)値で返します。
- 構文
EXISTS(Any)=Bool
- 例 1 JSON listまたは JSON object違うので falseで返す
EXISTS(5)=false
- 例2
- Input JSON
{ "device" : [] } または { "device" : {} }
- Query
SELECT EXISTS(device) as empty_device FROM "iot"
- Result JSON
{ "empty_device" : false }
- Input JSON
RAND
0.0~1.0の範囲の均等確率でランダム値を返します。
- 構文
RAND()=Number
- 例
RAND()=0.1897250037492607
CHAR_LENGTH
文字列の文字数を返します。
- 構文
CHAR_LENGTH(String)=Integer
- 例
CHAR_LENGTH('heLLo')=5
UPPER
大文字で置換して返します。アルファベット以外の文字は影響を受けません。
- 構文
UPPER(String)=String
- 例
UPPER('hi99')="HI99"
LOWER
小文字で置換して返します。アルファベット以外の文字は影響を受けません。
- 構文
LOWER(String)=String
- 例
LOWER('NEXT99')="next99"
TRIM
文字列の前後の特定文字を削除します。TRIM(String)、TRIM(表現式 FROM String)、TRIM(表現式 String FROM String)のように様々な形で使用可能です。
- LEADINGの場合、先頭の文字列だけを、TRAILINGの場合は末尾の文字列だけを、BOTHは両方を削除します。
- 基本的には LEADING、TRAILING、BOTHの間に特定文字を指定して、その文字を削除することができ、指定しない場合はスペースを削除します。
- 構文
TRIM(表現式 String FROM String)=String
- 例
- TRIM(' foobar ') -- "foobar" - TRIM(' \tfoobar\t ') -- "\tfoobar\t" - TRIM(LEADING FROM ' foobar ') -- "foobar " - TRIM(TRAILING FROM ' foobar ') -- " foobar" - TRIM(BOTH FROM ' foobar ') -- "foobar" - TRIM(BOTH '1' FROM '11foobar11') -- "foobar" - TRIM(BOTH '12' FROM '1112211foobar22211122') -- "foobar"
LEADING_PAD
文字列の先頭に特定の文字列を追加します。
- 構文
LEADING_PAD(String, Integer, String(オプション))=String
- 例
LEADING_PAD('device', 2)=" device", LEADING_PAD('device', 2, 'm')="mmdevice"
TRAILING_PAD
文字列の末尾に特定の文字列を追加します。
- 構文
TRAILING_PAD(String, Integer, String(オプション))=String
- 例
TRAILING_PAD('device', 2)="device ", TRAILING_PAD('device', 2, 'm')="devicemm"
NUMBYTES
文字列の UTF-8エンコーディングの基準バイト数を返します。
- 構文
NUMBYTES(String)=Integer
- 例
NUMBYTES('good')=4, NUMBYTES('∀')=3
STARTSWITH
最初の引数が2番目の引数の文字列で始まるかどうかを真(true)、偽(false)値で返します。
- 構文
STARTSWITH(String, String)=Bool
- 例
STARTSWITH('hello', 'he')=true
ENDSWITH
最初の引数が2番目の引数の文字列で終わるかどうかを真(true)、偽(false)値で返します。
- 構文
ENDSWITH(String, String)=Bool
- 例
ENDSWITH('hello', 'lo')=true
INDEXOF
最初の引数に2番目の引数の文字列が存在する場合、同じ最初の文字列の開始インデックスを返します。そうでない場合は、-1を返します。
- 構文
INDEXOF(String, String)=Integer
- 例
INDEXOF('hello', 'el')=1, INDEXOF('hello', 'xx')=-1
REPLACE
最初の引数の文字列で、2番目の引数の文字列を検索し、3番目の引数にすべて置換して返します。
- 構文
REPLACE(String, String, String)=String
- 例
REPLACE('hello', 'l', 'ee')="heeeeeo"
REGEXP_REPLACE
最初の引数の文字列で、2番目の正規表現と一致する文字列をすべて見つけて、3番目の引数に置換して返します。3番目の引数に「$」を使用してキャプチャグループを参照できます。
- 構文
REGEXP_REPLACE(String, String, String)=String
- 例1
REGEXP_REPLACE('xdevice', 'x{.*}', 'invalid')="invalid"
- 例2
REGEXP_REPLACE('x is b y is a', '(.*) is (.*))', '$2')="a"
REGEXP_MATCHES
最初の引数の文字列で、2番目の正規表現と一致する文字列が含まれている場合、真(true)値で返します。
- 構文
REGEXP_MATCHES(String, String)=Bool
- 例
REGEXP_MATCHES('hello', 'l{2,}')=true, REGEXP_MATCHES('halo', 'l{2,}')=false
REGEXP_SUBSTR
最初の引数の文字列で、2番目の正規表現と一致する最初の一致する文字列を検索します。
- 構文
REGEXP_SUBSTR(String, String)=String
- 例
REGEXP_SUBSTR('byebyeY', '(bye)*')="byebye"
CONCAT
すべての引数の STRING値を接続します。
- 構文
CONCAT(String, String, ...)=String
- 例
CONCAT('he', 'll', 'o')="hello"
LIST
すべての引数の値を Listに作成して返します。
- 構文
LIST(Any, Any, ...)=JSONList
- 例
LIST('he', 1, true, null, `{"a":"b"}`,`[1]`)=["he", 1, true, null, {"a":"b"}, [1,2,3]]
FLATLIST
すべての引数の値を Listに作成して返します。引数の中に Listがある場合、展開して加えます。
- 構文
FLATLIST(Any, Any, ...)=JSONList
- 例
LIST('he', 1, true, null, `{"a":"b"}`,`[1,2,3]`)=["he", 1, true, null, {"a":"b"}, 1, 2, 3]
SUBSTRING
文字列を切ります。最初の引数値の文字列で、2番目の引数値の数字に該当する文字から3番目の引数値の数だけ文字列を返します。3番目の引数がない場合は、2番目の引数値の数字に該当する文字から後ろのすべての文字列を返します。
- 構文
SUBSTRING(String, Integer, Integer)=String
- 例
- SUBSTRING('12345', 0)="12345", SUBSTRING('12345', 1)="12345", SUBSTRING('12345', 3)="345" - SUBSTRING('12345', 2, 3)="2", SUBSTRING('12345', -2, 0)="" (empty値) , SUBSTRING('12345', 5, 5)=""(empty)
NEWUUID
任意の16バイト UUIDを返します。
- 構文
NEWUUID()=String
- 例
NEWUUID()="0491e6b5-afee-4a39-97a3-14bc6c35fda9"
HASH
最初の引数を2番目の引数の型にハッシュを取得します。サポートするハッシュタイプは、MD2、MD5、SHA-1、SHA-224、SHA-384、SHA-256、SHA-512です。大文字と小文字は区別しませんが、正確にタイプを入力する必要があります。
構文
HASH(String, String)=String
例
HASH('iotgood', 'sha-1')="edcf3d81bd181b9b37bc9748766b16345f7fb405"
ENCODE
最初の引数を2番目の引数のエンコーディグタイプでエンコードします。サポートするエンコーディングタイプは Base64で、正確にタイプを入力する必要があります。
構文
ENCODE(String, String)=String
例
ENCODE('iot', 'base64')="aW90"
DECODE
最初の引数を2番目の引数のデコーディングタイプでデコードします。サポートするデコーディングタイプは Base64のみをサポートしており、正確にタイプを入力する必要があります。
- 構文
DECODE(String, String)=String
- 例
DECODE('aW90', 'base64')="iot"
CHR
入力された Integerに対応する ASCII文字を返します。
- 構文
CHR(Integer)=String
- 例
CHR(65)="A"
GET_ITEM
最初の引数の値から2番目の引数の順番のアイテムを呼び出します。最初の引数が Stringである場合、対応する Indexの文字を1つ呼び出します。
構文
GET_ITEM(JSONObject または JSONList または String)=Any
例
- リストから呼び出す
GET_ITEM(`["banana", "apple", "grape"]`, 2)="grape"
- オブジェクトから呼び出す
GET_ITEM(`{"device":"none"}`, 'device')="none"
- Stringから呼び出す
GET_ITEM('banana', 2)="n"
SIZE
JSON値の Sizeを返します。
構文
SIZE(JSONObject または JSONList)=Integer
例 1 リストのアイテム数を返す
- Input JSON
{ "lux": [null, 2, "3"] }
- Query
SELECT SIZE(t.lux) AS "count" FROM "topic" AS t
- Result JSON
{ "count": 3 }
- Input JSON
例 2 キー-値のペアの数を返す
Input JSON
{ "info": { "dv1": 1, "volt": "1v", "id": null }, "lux": [1, 2] }
Query
SELECT SIZE(t.info) AS "count" FROM "topic" AS t
Result JSON
{ "count": 3 }
例 3 JSON値を直接入力する場合、`(Grave Accent)で括って入力できます。
Query
SELECT SIZE(`{ "device": 1, "lux": 1}`) AS "count" FROM "topic" AS t
Result JSON
{ "count": 2 }
COALESCE
引数が null以外の値のうち、一番左の引数の値を返します。入力引数は可変で、少なくとも1つは入力する必要があります。
- 構文
COALESCE(...)=Any
- 例
COALESCE('s', null, 1)='s', COALESCE(null, null, 1)=1, COALESCE(null, null)=null
CAST
値をキャストします。typeには、boolean、integer、float、stringを使用することができます。
- 構文
CAST(Any AS type)=type
- 例1 Booleanでキャスト(1, 1.0, 「true」のみ trueに変換する。その他は false)
- CAST(0 AS boolean)=false - CAST(1 AS boolean)=true - CAST(1.1 AS boolean)=true - CAST('1' AS boolean)=false - CAST('true' AS boolean)=true
- 例2
- CAST(true AS integer)=1 - CAST(false AS integer)=0 - CAST(1.75 AS integer)=1 - CAST('aa' AS integer)=(error発生) - CAST('22' AS integer)=22
- 例3
- CAST('2.2' AS float)=2.2 - CAST(true AS float)=1.0 - CAST(true AS string)="true"
UNIXTIME_NOW
現在時刻の Unixタイムスタンプ(ミリ秒)を取得します。
- 構文
UNIXTIME_NOW()=Integer
- 例
UNIXTIME_NOW()=1594614865656
UNIXTIME_TO_STRING
最初の引数を、2番目の引数の日付フォーマットの形式に合わせて変換して、文字列を変換します。3番目の引数は TimeZoneで値がない場合、UTC TimeZone基準で変換します。
- 構文
UNIXTIME_TO_STRING(Integer, String, String(オプション))=String
- 例1
UNIXTIME_TO_STRING(1594579192000, 'yyyy MM dd hh:mm:ss z', 'Asia/Seoul')="2020 07 13 03:39:52 KST"
- 例2
UNIXTIME_TO_STRING(1594579192000, 'hh:mm:ss')="06:39:52"
STRING_TO_UNIXTIME
最初の引数を、2番目の引数の日付フォーマット形式に合わせて文字列を Unixタイムスタンプ(ミリ秒)に変換します。3番目の引数は TimeZoneで、値がない場合、UTC TimeZone基準で変換します。
- 構文
STRING_TO_UNIXTIME(String, String, String(オプション))=Integer
- 例1
STRING_TO_UNIXTIME('2020 07 13 03:39:52', 'yyyy MM dd hh:mm:ss', 'Asia/Seoul')=1594579192000
- 例2
STRING_TO_UNIXTIME('2020 07 13 06:39:52.222', 'yyyy MM dd hh:mm:ss.SSS')=1594622392222
EXTRACT
Unixタイムスタンプで表現式を使用して UTC Timezoneに YEAR、MONTH、HOUR、MINUTE、DAY、SECOND値を呼び出せます。
- 構文
EXTRACT(表現式 FROM Integer)=Integer
- 例
- EXTRACT(YEAR FROM 1594579192031) -- 2020 - EXTRACT(MONTH FROM 1594579192031) -- 7 - EXTRACT(HOUR FROM 1594579192031) -- 18 - EXTRACT(DAY FROM 1594579192031) -- 12 - EXTRACT(MINUTE FROM 1594579192031) -- 39 - EXTRACT(SECOND FROM 1594579192031) -- 52
ADD_TIME
Unixタイムスタンプで表現式を使用して UTC Timezoneに YEAR、MONTH、HOUR、MINUTE、DAY、SECOND値を加えて引くことができます。2番目の引数の値を3番目の引数の値に表現式の単位で加えます。
- 構文
ADD_TIME(表現式, Integer, Integer)=Integer
- 例
ADD_TIME(MINUTE, -10, 1594579198031)=1594578598031
DIFF_TIME
Unixタイムスタンプで表現式を使用して UTC Timezoneに YEAR、MONTH、HOUR、MINUTE、DAY、SECONDの基準時間の差を求めることができます。3番目の引数の Unixタイムスタンプより2番目の引数の Unixタイムスタンプの方が大きい場合、戻り値が-と表示されます。
- 構文
DIFF_TIME(表現式, Integer, Integer)=Integer
- 例1
DIFF_TIME(SECOND, 1594579192031, 1594579198031)=6
- 例2
DIFF_TIME(MINUTE, 1594579992031, 1594579198031)=-13
CASE構文
Case構文を使用して、switchのような分岐処理を行うことができます。少なくとも1つ以上の WHEN節が必要です(ELSE節は選択項目)。WHENでは、評価値が正しいか違うかだけが確認でき、不等号の使用はできません。
例1
CASE 評価値 WHEN 値1 THEN 戻り値1 WHEN 値2 THEN 戻り値2 ... ELSE 返却値の残り END
例2
- Input JSON
{ "fruit" : "apple" }
- Query
SELECT CASE fruit WHEN 'apple' THEN 'red' WHEN 'banana' THEN 'yellow' ELSE 'no color' END as color FROM "fruit/color"
- Result JSON
{ "color": "red" }
例 3 評価値と値1、値2 ...には、Number、Stringの両方が可能であり、Key値として JSON Valueを参照できます。
- Input JSON
{ "my_score" : 31, "team_score" : 30 }
- Query
SELECT CASE 30 WHEN my_score THEN my_score * 2 WHEN team_score THEN team_score/2 ELSE 'nothing 30' END as final_score FROM "score/30"
- Result JSON
{ "final_score" : 15 }
リテラル構文
リテラル値を直接作成することができます。
例1
- Input JSON
{ "xy": [47.606,-122.332] }
- Query
SELECT {'x': GET_ITEM(xy, 0),'y':GET_ITEM(xy, 1)} as result FROM "topic/coord"
- Result JSON
{ "result" : { "x" : 47.606, "y" : -122.332 } }
例2
- Input JSON
{"lat" : 47.696, "long" : -122.332}
- Query
SELECT [lat,long] as lat_long FROM "topic/coord"
- Result JSON
{ "lat_long" : [47.606,-122.332]}