作為一點背景。我想使用來自其他列的值用 jsonb 值填充一列。最初,我使用了這個查詢:
UPDATE myTable
SET column_name =
row_to_json(rowset)
FROM (SELECT column1, column2 FROM myTable)rowset
然而,這個查詢在一個有 900 萬條記錄的資料集上運行的時間似乎太長了(在我停止它之前的幾個小時)。所以我尋找第二個 FROM 子句的解決方案并找到了 jsonb_insert 函式。為了測驗查詢,我首先運行了這個示例查詢:
SELECT jsonb_insert('{}','{column1}','500000')
{'column1':500000}作為輸出給出。完美,所以我嘗試使用實際列填充值:
SELECT jsonb_insert('{}':,'{column1}',column1) FROM myTable WHERE id = <test_id>
這給出了一個語法錯誤和一個添加引數型別的建議,這導致我如下:
SELECT jsonb_insert('{}':,'{column1}','column1')
FROM myTable WHERE id = <test_id>
SELECT jsonb_insert('{}'::jsonb,'{column1}'::jsonb,column1::numeric(8,0))
FROM myTable WHERE id = <test_id>
這兩個查詢都給出了無效的輸入型別語法錯誤,令牌“column1”無效。
我似乎真的無法使用檔案找到這些查詢的正確語法。有誰知道正確的語法是什么?
uj5u.com熱心網友回復:
因為jsonb_insert函式可能需要對引數使用jsonb型別new_value
jsonb_insert(目標 jsonb, 路徑文本[], new_value jsonb [, insert_after boolean])
如果我們想獲得 JSON 的數字型別,我們可以嘗試在轉換之前將列轉換為字串型別jsonb
如果我們想得到一個字串型別的 JSON,我們可以嘗試使用concat帶雙引號的函式。
CREATE TABLE myTable (column1 varchar(50),column2 int);
INSERT INTO myTable VALUES('column1',50000);
SELECT jsonb_insert('{}','{column1}',concat('"',column1,'"')::jsonb) as JsonStringType,
jsonb_insert('{}','{column2}',coalesce(column2::TEXT,'null')::jsonb) as JsonNumberType
FROM myTable
sqlfiddle
筆記
如果我們的列值可能為 null,我們可以嘗試將'null'for coalescefunction as coalesce(column2::TEXT,'null')。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/469542.html
標籤:sql json PostgreSQL jsonb
