Postgresql
在 JSONB 中呼叫函式?
是否可以呼叫函式,例如
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) } ]