규칙 쿼리 작성
    • PDF

    규칙 쿼리 작성

    • PDF

    Article Summary

    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.0t.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 }
        

    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)="&nbsp;&nbsp;device", LEADING_PAD('device', 2, 'm')="mmdevice"
      

    TRAILING_PAD

    문자열의 끝 부분에 특정 문자열을 추가합니다.

    • 구문
      TRAILING_PAD(String, Integer, String(옵션))=String
      
    • 예시
      TRAILING_PAD('device', 2)="device&nbsp;&nbsp;",         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
        }
        
    • 예시 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]}
      

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.