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