-> 與 ->> 查詢差異
PostgreSQL 查詢 field 內容時有兩大 operators,主要差別在於回傳的資料型別
->>
: 回傳的是 Json 的字面量
->
: 回傳的是 Jsonb 物件
內容查詢語法: ->>
Operator
- ->> 用來查出 JSON/JSONB 物件 field 內容,並以 String 格式 回傳結果。
- 注意 PostgreSQL ->> 的查詢結果顯示時 沒有 用 Double Quotes 包住。
select address->>'country' as COUNTRY FROM profile;
COUNTRY
--------
TAIWAN
KOREA
JAPAN
CHINA
Jsonb 物件查詢語法: ->
Operator
- -> 用來查出 JSON/JSONB 物件內容,並以 JSON/JSONB 物件格式 回傳結果。
- ->JSON 查詢,所得為 postgreSQL JSON 物件,所以可以 -> 繼續往內槽串查。最終再以 ->> 取值。
- 注意 PostgreSQL -> 的查詢結果 有 用 Double Quotes (為 JSON 物件)包住。
"student": {
"first_name": "insect",
"last_name": "totem",
"class": {
"class_name" : "A",
"grade" : {
"grade_name" : "3",
"school" :{
"school_name" : "Entomology"
}
}
}
}
- ->> return String
select Student_column->'student'->'class'->'grade'->'school'->> 'school_name' as SCHOOL from Profile;
SCHOOL
text
-------
Entomology
- -> return jsonb
select Student_column->'student'->'class'->'grade'->'school'-> 'school_name' as SCHOOL from Profile;
SCHOOL
jsonb
-------
"Entomology"
- -> return jsonb
select Student_column->'student'->'class'->'grade'->'school' as SCHOOL from Profile;
SCHOOL
jsonb
-------
"{"school_name": "Entomology"}"
當查詢結果是 Array Element
- 當查詢結果是 Array Element 時,PostgreSQL 可以再向內以 index 查找指定位置元素。
- 註: zero-based index
->>
、->
若指向的結果是 Array,則允許再串一個zero-based index
,以取出單一元素。
- 例如: 'profile'->'phones' -> 0
範例情境
{
"profile": {
"first_name": "insect",
"last_name": "totem",
"phones": ["0922-222-222","0955-555-555"]
}
}
SELECT last_name, raw_data #> 'profile'->'phones'->0 as phone_1 FROM Student
LAST_NAMR PHONE_1
character varying jsonb
----------------------------------------
totem "0922-222-222"