如何在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),您將看到以下輸出:
序列號 | 姓名 | 元資料 |
---|---|---|
1 | Yash | {"marks_scored":{"science":50,"maths":65}} |
2 | Isha | {"marks_scored":{"science":70,"maths":45}} |
但是,我們可以做得更好。假設我想知道Yash和Isha在科學方面取得的分數。我只需要使用->運算子即可。請參見下面的示例:
SELECT name, metadata->'marks_scored'->'science' as science_marks from json_test
輸出將是
姓名 | 科學分數 |
---|---|
Yash | 50 |
Isha | 70 |
請注意,這裡輸出列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 |