Postgres Querying/กำลังกรอง JSONB กับรอบการ arrays

0

คำถาม

ด้านล่างนี้เป็นของฉันตัวอย่างสำคัญที่สุ

ฉันต้องการลูกค้าที่พบทั้งหมดใต้เงื่อนไข

  1. ในประเทศ"xyz",บริษัทระหว่าง 2019 จะ 2021.
  2. น่าจะมีอย่างน้อยหนึ่งบัญชีกับความสมดุลระหว่า 10000 และ 13000 และแบรนซ์เป็น"เอบีซี"และการต่อรองวันระหว่าง 20200110 และ 20210625. มันเป็น formatted และถูกจัดเก็บไว้ที่เบอร์
  3. น่าจะมีอย่างน้อยหนึ่งที่อยู่ในรัฐ"state1"และเข็มกลัดหัสระหว่าง 625001 และ 625015

ด้านล่างนี้เป็นโครงสร้างของโต๊ะ

        CREATE TABLE IF NOT EXISTS customer_search_ms.customer
        (
            customer_id integer,
            customer_details jsonb
        )
    

มันไม่น่าจะเป็นล้านๆของจำนวนแถวในโต๊ะ ฉันต้องสร้างจินดัชนีของประเภท jsonb_ops บ customer_details คอลัมน์ที่เราจะยังเป็นกำลังตรวจสอบรอยู่รอดของเงื่อนไขและช่วงเปรียบเทียบ

ด้านล่างนี้เป็นตัวอย่างข้อมูลใน customer_data JSONB คอลัมน์

customer_id : 1

    {
        "customer_data": {
            "name": "abc",
            "incorporated_year": 2020,
            "country":"xyz",
            "account_details": [
                {
                    "transaction_dates": [
                        20180125, 20190125, 20200125,20200525
                    ],
                    "account_id": 1016084,
                    "account_balance": 2000,
                    "account_branch": "xyz"
                },
                {
                    "transaction_dates": [
                        20180125, 20190125, 20200125
                    ],
                    "account_id": 1016087,
                    "account_balance": 12010,
                    "account_branch": "abc"
                }
            ],
            "address": [
                {
                    "address_id": 24739,
                    "door_no": 4686467,
                    "street_name":"street1",
                    "city": "city1",
                    "state": "state1",
                    "pin_code": 625001
                },
                {
                    "address_id": 24730,
                    "door_no": 4686442,
                    "street_name":"street2",
                    "city": "city1",
                    "state": "state1",
                    "pin_code": 625014
                }
            ]
        }
    }

ตอนนี้ตอน query ฉันเขียนเพื่ออยู่เหนือคือ

SELECT  c.customer_id,
        c.customer_details
FROM customer_search_ms.customer c
WHERE c.customer_details @@ CAST('$.customer_data.country ==  "xyz" && $.customer_data.incorporated_year >= 2019 && $.customer_data.incorporated_year <= 2021 ' AS JSONPATH)
AND c.customer_details @? CAST('$.customer_data.account_details[*] ? (@.account_balance >=  10000) ? (@.account_balance <=  13000) ?(@.account_branch ==  "abc") ? (@.transaction_dates >=  20200110) ? (@.transaction_dates <=  20210625)' AS JSONPATH)
AND c.customer_details @? CAST('$.customer_data.address[*] ? (@.state ==  "state1") ? (@.pin_code >=  625001) ? (@.pin_code <= 625015)  ' AS JSONPATH)

ต้องจัดการอยู่เหนือสถานการณ์มันคือหนทางที่ดีที่สุดที่จะเขียน มันจะเป็นไปได้รวมทั้งหมด 3 เงื่อนไขการเรียงลำดับน(ลูกค้า/บัญชีผู้ใช้เครื่อง/ที่อยู่ของเครื่อง)ในหนึ่งหรอกหรอ?การฉีกกรอ โต๊ะจะมีเป็นล้านๆของแถว. ฉันเป็นของความเห็นจะมีมันเป็นหนึ่งแสดงออกและไปออกกำลังกา DB จะทำให้ดีที่สุดที่การแสดง. มันจะเป็นไปได้รวมพวกนี้ 3 เงื่อนไขเป็นหนึ่งแสดง

1

คำตอบที่ดีที่สุด

0

ของคุณกับการค้นหายังไม่ให้เกิดข้อผิดพลาดคุณรายงาน ให้มันวิ่งแต่มันให้คน"ผิด"ผลตรวจเทียบได้กับสิ่งที่คุณต้องการ มีหลายอย่างผิดพลาดอยู่ในนั้นซึ่งไม่ใช่รูปแบบการสั่งงานผิดพลาด,แต่แค่ให้ผิดผลลัพธ์เดียวกันนั่นแหละ

คนแรกของ jsonpath ดูสบายดี มันเป็นตรรกะเงื่อนไขการแล้ว @@ เช็คถ้ามันสำนวนมีค่า true.

ที่สองของเธอ jsonpath มีสองปัญหา มันมีค่ารายชื่อของวัตถุงซึ่งตรงกับเงื่อนไขของคุณ. แต่วัตถุไม่ได้ booleans ดังนั้น @@ จะไม่มีความสุขแล้วก็กลับภาษา sql โพรโทคอล aimcomment ซึ่งก็คือปฏิบัติเหมือนกับเท็จมาที่นี่ แทนที่จะเป็นคุณต้องการจะทดสอบถ้ามันรายการว่างเปล่า นี่คือสิ่งที่ @? มันดังนั้นใช้มันแทนที่จะเป็น @@. แล้วก็วันของคุณจะถูกจัดเก็บไว้ในฐาน 8-ตัวเลข integers แต่คุณเปรียบเทียบพวกเขาต้อง 8-ตัวละครเป็นอิสระนะ ใน jsonpath,ช่างแข่งประเภท comparisons ยอมจำนนต่อ LANGUAGE โพรโทคอล aimcomment ซึ่งก็คือปฏิบัติเหมือนกับเท็จมาที่นี่ ดังนั้นคุณจะต้องเปลี่ยนแปลงจัดเก็บข้อมูลที่จะใช้เส้นสายหรือเปลี่ยน literals พวกเขาคือเทียบกับเข้าไปใน integers.

ของคุณที่สาม jsonpath นก็ยังคงมี @@ ปัญหาแล้ว และมันคงย้อนกลับของประเภทมีปัญหา,คุณต้องกา pin_code ถูกจัดเก็บไว้ที่ใช้เส้นสาย,แต่คุณกำลังทดสอบพวกเขาต่อต้าน integers. ในที่สุดคุณต้อง'pin_code'สะกดผิดในการเกิดขึ้นอีก.

2021-11-24 20:58:29

ขอบคุณ Janes. ฉันมีแก้ไขกฎและข้อมูลในแบบต้นฉบับซะหน่อย เนื่องจากความลับธรรมชาติฉันต้องโพสปรุงข้อมูลและทำผิดพลาดในเรื่องนั้น ฉันไม่สามารถ reproduce ข้อผิดพลาดในสถานการณ์. มันมีดีกว่าเข้ามาสำหรับการให้อยู่เหนือกับ 3 เงื่อนไขในที่เงื่อนไขว่า. ฉันคิดคือถ้าฉันสามารถทำให้มันเป็นเงื่อนไขเดียวแทนที่จะเป็น 3 มันจะต้องดีขึ้น มีคำแนะนำจะเป็นเยี่ยมมาช่วยฉันนะ ขอบคุณ
Balaji Govindan

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่