当具有NULL值时,在生成查询以将JSON数组显示为一组文本值时遇到问题。假设我有下表:
Name | Meta
Art0 | {"category":["sport"]}
Art1 | [NULL]
Art2 | {"category":["sport", "health"]}
如果我做类似的事情:
SELECT name, jsonb_array_elements_text(meta->'category') tag FROM table
我得到以下结果:
Name | Tag
Art0 | sport
Art2 | sport
Art2 | health
问题在于Art1已被删除。如何执行一个查询,该查询还包含Art1的一行,并且在Tag列上包含一个空字符串或NULL值?
谢谢
答案 0 :(得分:1)
使用left join
:
select name, tag
from my_table
left join jsonb_array_elements_text(meta->'category') as tag on true
name | tag
------+--------
Art0 | sport
Art1 |
Art2 | sport
Art2 | health
(4 rows)
这是横向联接,即该函数对表中的每一行执行一次。通常,这样的联接记为cross join
,但是当函数什么也不返回时,我们也希望得到结果。为此,我们可以使用left join
,它需要一个连接条件,因此我们将true
用作始终满足的条件。
答案 1 :(得分:1)
并且没有join
/ union
:
SELECT
name,
jsonb_array_elements_text(coalesce(meta->'category', '[null]')) tag
FROM table;
答案 2 :(得分:0)
您可以使用dragDrop: function (node, data) { //dradDrop fancyTree event callback
...
const current_file = data.dataTransfer.files[0];
if (current_file != null) { //i.e. when another fancytree is dropped dataTransfer.files is an empty array
const reader = new FileReader();
reader.addEventListener("loadend", function (event) {
file2upload = event.target.result; //This is the raw content of the file
//For my purposes the following 3 lines apply a byte array to Blob conversion
const binaryData = [];
binaryData.push(file2upload);
const blob = new Blob([new Uint8Array(file2upload)]);
});
reader.readAsArrayBuffer(current_file); //Read the File object as a byte array stream
}
}
进行操作,就像处理表格时一样:
LEFT JOIN
会导致:
SELECT name, tag FROM table
LEFT OUTER JOIN jsonb_array_elements_text(meta->'category') tag ON TRUE
答案 3 :(得分:0)
使用union
SELECT name, jsonb_array_elements_text(meta->'category') tag FROM table UNION
SELECT id, attrs::text tag FROM table where meta is null;
结果:
name tag
Art0 sport
Art2 sport
Art2 health
Art1