Postgresql

在 JSONB 中呼叫函式?

  • December 9, 2016

是否可以呼叫函式,例如now()在 Postgres 中插入/更新 JSONB 列時?

我在想類似下面的內容,其中time將設置為的返回值now()SELECT '{"value": 5, "time": now()}'::JSONB;

當然,JSON 不支持特殊的日期類型(JavaScript 也不支持)JSONB 只支持

  • string
  • number
  • boolean
  • null

所以只需使用字元串插值,它將以相同的方式儲存:

SELECT (
 '{"value": 5, "time": "' || now() || '" }'
)::JSONB;

如果您想NOW()在一次呼叫中簡單地從伺服器獲取,您當然可以使用jsonb_set, 或 jsonb 連接 ( ||) 來實現。這是文件

SELECT '{"value": 5}'::JSONB || jsonb_build_object('time', now());

在第三方庫中,這可能看起來像..

INSERT INTO table (json)
VALUES ( ? || jsonb_build_object('time', now()) );

它仍然很醜。我不會將數據時間儲存在 JSONB 中,除非我必須:

  • 它會很慢。
  • 這將佔用更多空間。

順便說一句,Pg 可以選擇的 JSONB 替代方案之一是BSON,它不將日期儲存為字元串。.

僅僅因為您提到node-postgres “作為 json 值”,如果您將它作為準備好的語句傳遞,則now()不需要,例如:jsonb_build_object

var pg = require('pg');
var conString = 'postgres://n@10.1.10.199/b';
var pgClient = new pg.Client(conString);
pgClient.connect();

var query = 'select concat(\'{"value": 5, "time": "\',$2::timestamptz,\'"}\')::jsonb, $1::timestamptz';
var values = ['now()','now()'];
var cb = function(err, result) {
 console.log(result.rows);
};

pgClient.query(
 {
   name: 'get some',
   text: query,
   values: values
 }
 , cb
);

顯示:

[
 {
   concat: {
     time: '2016-12-09 14:16:28.539636+00',
     value: 5
   },
   timestamptz: FriDec09201614: 16: 28GMT+0000(GMTStandardTime)
 }
]

引用自:https://dba.stackexchange.com/questions/157634