将JSON数组扩展为带NULL的文本值

时间:2018-09-20 17:06:03

标签: json postgresql

当具有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值?

谢谢

4 个答案:

答案 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