- 인쇄
- 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" }
조명 밝기가 50 lux 미만인 데이터의 메시지 내 모든 필드 추출하는 쿼리
SELECT * FROM "apt/+/sensor/light" AS t WHERE t.light < 50
특정 건물의 조명 밝기가 50 lux 미만인 데이터의 메시지 내 특정 필드만 추출하는 쿼리
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의 토픽 최대 길이는 255 Byte(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)는 토픽에 포함될 수 없습니다.
- 토픽은 / 또는 // 이 될 수 없습니다.
- 다중 레벨 와일드카드 #(해시태그)는 최종 레벨에만 사용할 수 있습니다.
- 단일 레벨 와일드카드 +(더하기)는 모든 레벨에서 사용할 수 있습니다.
- 와일드카드는 해당 레벨에서 단독으로 사용되어di gkau,다른 문자와 함께 사용할 수 없습니다.
- 규칙에 이미 등록된 메시지 재발행 액션이 있는 경우, 메시지 재발행 액션으로 다시 규칙 쿼리가 될 수 있는 토픽으로 설정하는 것은 불가능합니다.
문자열
함수, 비교문 등에서 문자열을 사용할 경우에는 '(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 이면 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
두 번째 인자의 숫자로 소수점을 절사한 값을 반환합니다. 두 번째 인자가 음수일 경우 0, 소수일 경우 소수 부분을 버림하여 두 번째 인자가 대체됩니다.
- 구문
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
첫 번째 인자를 두 번째 인자로 나눈 나머지를 반환합니다. % 연산자를 대신 사용할 수 있습니다.
- 구문
MOD(Integer, Integer)=Integer
- 예시
MOD(5, 2)=1
SQRT
숫자를 제곱근을 반환합니다.
- 구문
SQRT(Number)=Number
- 예시
SQRT(1.44)=1.2
POWER
첫 번째 인자를 두 번째 인자로 거듭 제곱한 결과를 반환합니다.
- 구문
POWER(Number, Number)=Number
- 예시
POWER(2, 4)=16
LOG
첫 번째 인자의 값을 두 번째 인자의 값을 밑(Base)로 하여 Log 값을 반환합니다. 첫 번째 인자가 0이면 -inf
String을, 0보다 작으면 nan
String을 반환합니다. 두 번째 인자가 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
두 값을 bit 값으로 변형한 후 OR연산한 값을 10진수로 반환합니다.
- 구문
BITOR(Integer, Integer)=Integer
- 예시
BITOR(4, 2)=6
BITAND
두 값을 bit 값으로 변형한 후 AND연산한 값을 10진수로 반환합니다.
- 구문
BITAND(Integer, Integer)=Integer
- 예시
BITAND(4, 2)=0
BITXOR
두 값을 bit 값으로 변형한 후 XOR연산한 값을 10진수로 반환합니다.
- 구문
BITXOR(Integer, Integer)=Integer
- 예시
BITXOR(5, 1)=4
NANVL
첫 번째 인자가 숫자면 첫 번째 인자를 반환하고, 숫자가 아니면 두 번째 인자를 반환합니다.
- 구문
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
입력된 두 개의 인자 값이 같으면 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
첫 번째 인자가 두 번째 인자의 문자열로 시작하는지 참(true),거짓(false) 값으로 반환합니다.
- 구문
STARTSWITH(String, String)=Bool
- 예시
STARTSWITH('hello', 'he')=true
ENDSWITH
첫 번째 인자가 두 번째 인자의 문자열로 끝나는지 참(true), 거짓(false) 값으로 반환합니다.
- 구문
ENDSWITH(String, String)=Bool
- 예시
ENDSWITH('hello', 'lo')=true
INDEXOF
첫 번째 인자에 두 번째 인자의 문자열이 존재할 경우, 같은 첫번째 문자열의 시작 인덱스를 반환합니다. 그렇지 않을 경우, -1을 반환합니다.
- 구문
INDEXOF(String, String)=Integer
- 예시
INDEXOF('hello', 'el')=1, INDEXOF('hello', 'xx')=-1
REPLACE
첫 번째 인자의 문자열에서 두 번째 인자의 문자열을 찾아 세 번째 인자로 모두 치환하여 반환합니다.
- 구문
REPLACE(String, String, String)=String
- 예시
REPLACE('hello', 'l', 'ee')="heeeeeo"
REGEXP_REPLACE
첫 번째 인자의 문자열에서 두 번째 정규식과 일치하는 문자열을 모두 찾아 세 번째 인자로 치환하여 반환합니다. 세 번째 인자에 '$'를 사용하여 캡처 그룹을 참조할 수 있습니다.
- 구문
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
첫 번째 인자의 문자열에서 두 번째 정규식과 일치하는 문자열이 포함되어 있으면 참(true) 값으로 반환합니다.
- 구문
REGEXP_MATCHES(String, String)=Bool
- 예시
REGEXP_MATCHES('hello', 'l{2,}')=true, REGEXP_MATCHES('halo', 'l{2,}')=false
REGEXP_SUBSTR
첫 번째 인자의 문자열에서 두 번째 정규식과 일치하는 첫번째 일치 문자열을 찾습니다.
- 구문
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
문자열을 자릅니다. 첫 번째 인자 값의 문자열에서 두 번째 인자 값의 숫자에 해당하는 글자부터 세번째 인자 값의 수만큼 문자열을 반환합니다.
세 번째 인자가 없다면 두 번째 인자 값의 숫자에 해당하는 글자 이후 모든 문자열을 반환합니다.
- 구문
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
첫 번째 인자를 두 번째 인자의 타입으로 해시를 구합니다. 지원하는 해시 타입은 MD2, MD5, SHA-1, SHA-224, SHA-384, SHA-256, SHA-512입니다. 대소문자는 구분하지 않으며 정확한 타입을 입력해야 합니다.
구문
HASH(String, String)=String
예시
HASH('iotgood', 'sha-1')="edcf3d81bd181b9b37bc9748766b16345f7fb405"
ENCODE
첫 번째 인자를 두 번째 인자의 인코딩 타입으로 인코딩합니다. 지원하는 인코딩 타입은 Base64이며, 정확한 타입을 입력해야 합니다.
구문
ENCODE(String, String)=String
예시
ENCODE('iot', 'base64')="aW90"
DECODE
첫 번째 인자를 두 번째 인자의 디코딩 타입으로 디코딩합니다. 지원하는 디코딩 타입은 Base64이며, 지원하며 정확한 타입을 입력해야 합니다.
- 구문
DECODE(String, String)=String
- 예시
DECODE('aW90', 'base64')="iot"
CHR
입력된 Integer에 대응하는 ASCII 문자를 반환합니다.
- 구문
CHR(Integer)=String
- 예시
CHR(65)="A"
GET_ITEM
첫 번째 인자 값에서 두 번째 인자의 순서의 아이템을 가지고 옵니다. 첫 번째 인자가 String이면 해당하는 Index의 글자 하나를 가져옵니다.
- 구문
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
첫 번째 인자를 두 번째 인자의 날짜 포맷 형식에 맞게 변환하여 문자열을 변환합니다. 세 번째 인자는 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
첫 번째 인자를 두 번째 인자의 날짜 포맷 형식에 맞게 문자열을 Unix 타임스탬프(밀리초)로 변환합니다. 세 번째 인자는 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 값을 더하거나 뺄 수 있습니다. 두 번째 인자 값을 세 번째 인자 값에 표현식 단위로 더합니다.
- 구문
ADD_TIME(표현식, Integer, Integer)=Integer
- 예시
ADD_TIME(MINUTE, -10, 1594579198031)=1594578598031
DIFF_TIME
Unix 타임스탬프에서 표현식을 사용하여 UTC Timezone으로 YEAR, MONTH, HOUR, MINUTE, DAY, SECOND 기준의 시간 차이를 구할 수 있습니다. 세 번째 인자의 Unix 타임스탬프보다 두 번째 인자의 Unix 타임스탬프가 더 큰 경우, 반환 값이 -로 나타납니다.
- 구문
DIFF_TIME(표현식, Integer, Integer)=Integer
- 예시 1
DIFF_TIME(SECOND, 1594579192031, 1594579198031)=6
- 예시 2
DIFF_TIME(MINUTE, 1594579992031, 1594579198031)=-13
CASE 구문
Case 구문을 사용하여 switch와 같은 분기 처리를 할 수 있습니다. 최소 한 개 이상의 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]}