Extensões JSON
Você pode usar as seguintes extensões para a sintaxe SQL padrão ANSI para facilitar o trabalho com objetos JSON aninhados.
Operador "."
Esse operador acessa membros em objetos e funções JSON incorporados identicamente a SQL padrão ANSI e JavaScript. Por exemplo:
SELECT foo.bar AS bar.baz FROM 'topic/subtopic'
seleciona o valor da propriedade bar
no objeto foo
a partir da seguinte carga útil de mensagem enviada ao tópico topic/subtopic
.
{ "foo": { "bar": "RED", "bar1": "GREEN", "bar2": "BLUE" } }
Se o nome de uma propriedade JSON incluir um caractere de hífen ou caracteres numéricos, a notação 'ponto' não funcionará. Em vez disso, você deve usar a função get para extrair o valor da propriedade.
Neste exemplo, a mensagem a seguir é enviada ao tópico iot/rules
.
{ "mydata": { "item2": { "0": { "my-key": "myValue" } } } }
Normalmente, o valor de my-key
seria identificado como nessa consulta.
SELECT * from iot/rules WHERE mydata.item2.0.my-key= "myValue"
No entanto, como o nome da propriedade my-key
contém um hífen e item2
contém um caractere numérico, a função get deve ser usada conforme mostra a consulta a seguir.
SELECT * from 'iot/rules' WHERE get(get(get(mydata,"item2"),"0"),"my-key") = "myValue"
*
Operador
Funciona da mesma maneira que o caractere curinga *
em SQL padrão ANSI. É usado somente na cláusula SELECT e cria outro objeto JSON contendo os dados da mensagem. Se a carga útil da mensagem não estiver no formato JSON, *
gerará toda a carga útil da mensagem como bytes brutos. Por exemplo:
SELECT * FROM 'topic/subtopic'
Como aplicar uma função a um valor de atributo
Veja a seguir um exemplo de carga útil JSON que pode ser publicada por um dispositivo:
{ "deviceid" : "iot123", "temp" : 54.98, "humidity" : 32.43, "coords" : { "latitude" : 47.615694, "longitude" : -122.3359976 } }
O exemplo a seguir aplica uma função a um valor de atributo em uma carga útil JSON:
SELECT temp, md5(deviceid) AS hashed_id FROM topic/#
O resultado dessa consulta é o seguinte objeto JSON:
{ "temp": 54.98, "hashed_id": "e37f81fb397e595c4aeb5645b8cbbbd1" }