ฉันมีตารางpersons
ซึ่งมีสองคอลัมน์และคอลัมน์ที่id
ใช้ JSONB data
(ตารางนี้เพิ่งสร้างขึ้นเพื่อวัตถุประสงค์ในการสาธิตเพื่อเล่นกับการสนับสนุน JSON ของ PostgreSQL)
ตอนนี้มันควรจะมีสองบันทึก:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
ตอนนี้ฉันควรจะได้ชื่อของทุกคนที่อายุมากกว่า 25 แล้วสิ่งที่ฉันได้ลองคือ:
select data->'name' as name from persons where data->'age' > 25
น่าเสียดายที่นี่ทำให้เกิดข้อผิดพลาด ฉันสามารถแก้ไขได้โดยใช้->>
แทน->
แต่จากนั้นการเปรียบเทียบไม่ทำงานตามที่คาดไว้อีกต่อไปเนื่องจากไม่ใช่การเปรียบเทียบตัวเลข แต่การแสดงเป็นสตริง
select data->'name' as name from persons where data->>'age' > '25'
จากนั้นฉันก็พบว่าฉันสามารถแก้ปัญหาได้จริงโดยใช้->
และนักแสดงไปที่int
:
select data->'name' as name from persons where cast(data->'age' as int) > 25
ใช้งานได้ แต่มันก็ไม่ดีที่ฉันต้องรู้ประเภทจริง (ชนิดของage
ในเอกสาร JSON อยู่number
แล้วดังนั้นทำไม PostgreSQL จึงไม่สามารถรู้ได้ด้วยตัวเอง?)
จากนั้นผมก็คิดว่าถ้าผมด้วยตนเองแปลงtext
โดยใช้::
ไวยากรณ์การทำงานทุกอย่างเป็นไปตามคาดเกินไป - แม้ว่าตอนนี้เรากำลังเปรียบเทียบสตริงอีกครั้ง
select data->'name' as name from persons where data->'age'::text > '25'
ถ้าฉันลองใช้ชื่อแทนอายุมันจะไม่ทำงาน:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
สิ่งนี้ส่งผลให้เกิดข้อผิดพลาด:
ไวยากรณ์อินพุตที่ไม่ถูกต้องสำหรับประเภท json
เห็นได้ชัดว่าฉันไม่ได้อะไรเลย น่าเสียดายที่มันค่อนข้างยากที่จะพบตัวอย่างจริง ๆ ของการใช้ JSON กับ PostgreSQL
คำใบ้ใด ๆ
'Jenny'
'"Jenny"'
data->'name'::text
คุณกำลังหล่อ'name'
สตริงเป็นข้อความไม่ใช่ผลลัพธ์ คุณไม่ได้รับข้อผิดพลาดเมื่อเปรียบเทียบกับ'25'
เพราะ25
เป็นตัวอักษร JSON ที่ถูกต้อง แต่Jenny
ไม่ใช่ (แม้ว่า"Jenny"
จะเป็น)