Ci-dessous mon échantillon
Je souhaite que les clients qui répondent à toutes les conditions ci-dessous
- Dans un pays "xyz", constituée entre 2019 et 2021.
- Doit avoir au moins un compte avec de l'équilibre entre 10000 et 13000 et de la direction générale est "abc" et la date de la transaction entre 20200110 et 20210625. Il est formaté et stocké sous forme de nombre
- Devrait avoir au moins une adresse dans l'état "état1" et des codes pin entre 625001 et 625015
Ci-dessous est la structure de la table
CREATE TABLE IF NOT EXISTS customer_search_ms.customer
(
customer_id integer,
customer_details jsonb
)
Il peut y avoir des millions de lignes dans la table. J'ai créé GIN index de type jsonb_ops sur le customer_details colonne comme nous, également, de vérifier l'existence des conditions et de la gamme de comparaison
Ci-dessous est un échantillon de données dans le customer_data JSONB colonne
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
}
]
}
}
Maintenant la requête que j'ai écrit ci-dessus est
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)
Pour gérer le scénario ci-dessus est la meilleure façon de l'écrire. Est-il possible de combiner tous les 3 critères (client/compte/adresse) dans une expression? La table aura des millions de lignes. Je suis de l'avis de l'avoir comme une expression et de frapper la DB offrira les meilleures performances. Est-il possible de combiner ces 3 conditions comme une expression