ฉันมีตาราง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"จะเป็น)