在row_SQL中排除row_to_json()中的空值

Mic*_*ael 11 postgresql json

我想将记录集的行转换为JSON,但不包括任何最终在JavaScript中未定义的空条目.例如,假设我有表testdata条目

id | prop1 (integer) | prop2 (text)
-------------------------------------
 1 |               42 | 'Answer'
 2 |             NULL | 'No prop one'
 3 |                0 | NULL
Run Code Online (Sandbox Code Playgroud)

然后执行

SELECT row_to_json(testdata) FROM testdata
Run Code Online (Sandbox Code Playgroud)

我得到的是:

{"id":"1","prop1":"42","prop2":"Answer"}
{"id":"2","prop1":null,"prop2":"No prop one"}
{"id":"3","prop1":"0","prop2":null}
Run Code Online (Sandbox Code Playgroud)

但相反,我想要的是:

{"id":"1","prop1":"42","prop2":"Answer"}
{"id":"2","prop2":"No prop one"}
{"id":"3","prop1":"0"}
Run Code Online (Sandbox Code Playgroud)

这可能吗?根据PostgreSQL 9.3 的JSON函数文档,只有一个额外的选项或参数row_to_json,但设置pretty_bool=true不会删除空值,所以似乎答案可能是否定的.但这似乎也是一个非常明显和有用的功能,所以我希望别人找到了我错过的东西.

我的最终目标是通过GET调用PHP页面来检索JavaScript中的记录.我是否最好从更标准的记录集中构建PHP中的JSON,而不是使用PostgreSQL的JSON例程?

mur*_*son 7

Postgres 9.5引入了json_strip_nulls功能,它似乎完全符合您的要求.


T.R*_*.R. 4

看起来该函数的未来版本可能有一个“忽略空值”选项 - https://commitfest.postgresql.org/action/patch_view?id=1496

  • 遗憾的是[此补丁已从代码中拉出](https://github.com/postgres/postgres/commit/c8a026e4f15e2063cd7fe6cb9ffe44f2a81398bd) - [请参阅此讨论](http://postgresql.nabble.com/json-b-and-空字段-td5820666.html)。希望 Postgres 9.5 能及时出现替代方案,尽管我目前在 Postgres 代码中看不到任何内容。 (2认同)
  • Postgresql 9.5(目前仍在开发中)具有 [json_strip_nulls](http://www.postgresql.org/docs/devel/static/functions-json.html) 功能。 (2认同)