如何在PostgreSQL中定義和查詢JSON列?


在PostgreSQL中定義JSON列的能力使其變得非常強大,並幫助PostgreSQL使用者體驗兩個世界的優勢:SQL和NoSQL。

建立JSON列非常簡單。您只需像建立其他列一樣建立/定義它,並將資料型別設定為JSON。

讓我們在PostgreSQL中建立一個名為json_test的新表:

CREATE TABLE json_test(
   serial_no SERIAL PRIMARY KEY,
   name VARCHAR,
   metadata JSON
);

現在,讓我們用一些資料填充它:

INSERT INTO json_test(name, metadata)
VALUES ('Yash','{"marks_scored":{"science":50,"maths":65}}'),
('Isha', '{"marks_scored":{"science":70,"maths":45}}');

如您所見,JSON值是用單引號括起來的,就像我們新增VARCHAR/TEXT值一樣。

現在,如果您查詢該表(SELECT * from json_test),您將看到以下輸出:

序列號姓名元資料
1Yash{"marks_scored":{"science":50,"maths":65}}
2Isha{"marks_scored":{"science":70,"maths":45}}

但是,我們可以做得更好。假設我想知道Yash和Isha在科學方面取得的分數。我只需要使用->運算子即可。請參見下面的示例:

SELECT name, metadata->'marks_scored'->'science' as science_marks
from json_test

輸出將是

姓名科學分數
Yash50
Isha70

請注意,這裡輸出列science_marks的型別為JSON,而不是INTEGER。這是因為→運算子始終返回json。除了→運算子之外,->>運算子也常用於。兩者之間的區別在於,→返回json,而->>返回文字。

因此,

  • metadata→'marks_scored'→'science'將返回一個JSON,即使我們為science_marks使用了整數

  • metadata→'marks_scored'->>' science'將返回文字

  • metadata->>'marks_scored'→'science'將報錯。因為'marks_scored'輸出不再是JSON,因此→運算子無法對其進行操作。

如果您明確需要以整數格式顯示science_marks,則首先以文字格式獲取結果,然後將其轉換為整數,如下所示:

SELECT name, CAST(metadata->'marks_scored'->>'science' as integer)
as science_marks from json_test

請注意,您不能將JSON轉換為整數。您需要在最後一步使用->>運算子獲取文字輸出,然後才能將文字轉換為整數。

就像您可以在查詢的select部分使用JSON列一樣,您也可以在查詢的WHERE部分使用它們。如果我們想找出在科學方面得分> 60的學生,您的查詢將如下所示

SELECT name from json_test
WHERE CAST(metadata->'marks_scored'->>'science' as integer) > 60

輸出將是

姓名
Isha


更新於: 2021年2月2日

1K+瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告