Postgres क्वैरी/छानने JSONB के साथ नेस्टेड सारणियों

0

सवाल

नीचे है मेरे नमूना आवश्यकता

मैं करना चाहते हैं, जो ग्राहकों को पूरा सभी शर्तों के नीचे

  1. देश में "xyz", शामिल 2019 के बीच करने के लिए 2021.
  2. होना चाहिए कम से कम एक खाते के साथ संतुलन के बीच 10000 और 13000 और शाखा है "एबीसी" और लेन-देन की तारीख के बीच 20200110 और 20210625. यह स्वरूपित और संग्रहीत संख्या के रूप में
  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
                }
            ]
        }
    }

अब इस प्रश्न को मैं लिखा है के लिए ऊपर है

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 अशक्त है, जो इलाज के रूप में एक ही झूठी यहाँ. इसके बजाय, आप की जरूरत है अगर परीक्षण करने के लिए है कि सूची खाली है. यह है क्या @? करता है, तो उस का उपयोग करें के बजाय @@. इसके अलावा, अपने तारीखों के रूप में संग्रहीत हैं 8 अंकों integers, लेकिन आप की तुलना कर रहे हैं उन्हें करने के लिए 8-चरित्र तार. में jsonpath, इस तरह के पार के प्रकार की तुलना उपज JSON अशक्त है, जो इलाज के रूप में एक ही झूठी यहाँ. तो आप या तो बदलने की जरूरत के भंडारण के लिए तार, या बदलने literals वे कर रहे हैं की तुलना में integers.

अपने तीसरे jsonpath भी है @@ समस्या है. और यह रिवर्स प्रकार की समस्या है, आप pin_code संग्रहीत तार के रूप में है, लेकिन आप परीक्षण कर रहे हैं के खिलाफ उन्हें integers. अंत में आप 'pin_code' गलत वर्तनी में एक घटना है ।

2021-11-24 20:58:29

धन्यवाद Janes. मैं सही है, कोड और डेटा मूल पोस्ट है. कारण करने के लिए गोपनीय प्रकृति मैं पोस्ट करने के लिए पकाया जाता है, डेटा और गलती किया था । मैं कर रहा हूँ में सक्षम नहीं करने के लिए त्रुटि को पुन: पेश परिदृश्य. वहाँ है कोई बेहतर दृष्टिकोण के लिए क्वेरी ऊपर दिए गए के साथ 3 स्थिति में जहां खंड है. मेरी सोच है, तो मैं कर रहा हूँ करने के लिए इसे बनाने के रूप में एक ही हालत में 3 के बजाय यह बेहतर होगा । किसी भी मार्गदर्शन बहुत मदद की हो जाएगा करने के लिए । धन्यवाद
Balaji Govindan

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में