ด้านล่างนี้เป็นของฉันตัวอย่างสำคัญที่สุ
ฉันต้องการลูกค้าที่พบทั้งหมดใต้เงื่อนไข
- ในประเทศ"xyz",บริษัทระหว่าง 2019 จะ 2021.
- น่าจะมีอย่างน้อยหนึ่งบัญชีกับความสมดุลระหว่า 10000 และ 13000 และแบรนซ์เป็น"เอบีซี"และการต่อรองวันระหว่าง 20200110 และ 20210625. มันเป็น formatted และถูกจัดเก็บไว้ที่เบอร์
- น่าจะมีอย่างน้อยหนึ่งที่อยู่ในรัฐ"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 เงื่อนไขเป็นหนึ่งแสดง