SQL 查询到 JSONiq 查询
SQL Query to JSONiq Query
我想将 SQL 查询转换为 JSONiq 查询,是否已经有一个实现,如果没有,我需要知道什么才能创建一个可以执行此操作的程序?
我不知道实现,但是,它在技术上是可行且简单的。 JSONiq 90% 的 DNA 来自 XQuery,而 XQuery 本身也部分由参与 SQL 的人员设计。
从数据模型的角度来看,table 被映射到一个集合,table 的每一行被映射到一个扁平的 JSON 对象,即所有字段都是原子的值,像这样:
{
"Name" : "Turing",
"First" : "Alan",
"Job" : "Inventor"
}
然后,通过将 SELECT-FROM-WHERE 查询转换为 FLWOR 表达式来完成映射,这提供了 SQL 功能的超集。
例如:
SELECT Name, First
FROM people
WHERE Job = "Inventor"
可以映射到:
for $person in collection("people")
where $person.job eq "Inventor"
return project($person, ("Name", "First"))
更复杂的查询也可以非常直接地映射:
SELECT Name, COUNT(*)
FROM people
WHERE Job = "Inventor"
GROUP BY Name
HAVING COUNT(*) >= 2
至:
for $person in collection("people")
where $person.job eq "Inventor"
group by $name := $person.name
where count($person) ge 2
return {
name: $name,
count: count($person)
}
实际上,如果for
调用了from
,return
调用了select
,如果这些关键字写成大写,[=35的语法=]iq 与 SQL 非常相似:它只是化妆品。
我想将 SQL 查询转换为 JSONiq 查询,是否已经有一个实现,如果没有,我需要知道什么才能创建一个可以执行此操作的程序?
我不知道实现,但是,它在技术上是可行且简单的。 JSONiq 90% 的 DNA 来自 XQuery,而 XQuery 本身也部分由参与 SQL 的人员设计。
从数据模型的角度来看,table 被映射到一个集合,table 的每一行被映射到一个扁平的 JSON 对象,即所有字段都是原子的值,像这样:
{
"Name" : "Turing",
"First" : "Alan",
"Job" : "Inventor"
}
然后,通过将 SELECT-FROM-WHERE 查询转换为 FLWOR 表达式来完成映射,这提供了 SQL 功能的超集。
例如:
SELECT Name, First
FROM people
WHERE Job = "Inventor"
可以映射到:
for $person in collection("people")
where $person.job eq "Inventor"
return project($person, ("Name", "First"))
更复杂的查询也可以非常直接地映射:
SELECT Name, COUNT(*)
FROM people
WHERE Job = "Inventor"
GROUP BY Name
HAVING COUNT(*) >= 2
至:
for $person in collection("people")
where $person.job eq "Inventor"
group by $name := $person.name
where count($person) ge 2
return {
name: $name,
count: count($person)
}
实际上,如果for
调用了from
,return
调用了select
,如果这些关键字写成大写,[=35的语法=]iq 与 SQL 非常相似:它只是化妆品。