레스 쿼리/필터링을 대화는 두서없이 중첩된 배열

0

질문

아래에 나의 샘플 요구 사항

내가 원하는 고객을 충족하는 모든 아래 조건

  1. 국가에서"xyz",통합된 사 2019 2021.
  2. 을 가지고해야합니다 적어도 하나의 계정으로 사이에 균형을 10000 및 13000 및 지사는"abc"및 트랜잭션 날짜를 사 20200110 및 20210625. 그것은 포맷으로 저장 번호
  3. 을 가지고해야합니다 적어도 하나의 주소는 상태에서"state1"과 pin 코드를 사 625001 및 625015

아래 테이블 구조

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

가 될 수 있는 수백만의 행 테이블에 있습니다. 내가 만들어 진 index 의 유형 jsonb_ops 에 customer_details 열로 우리는 것도 확인 존재에 대한 조건 및 비교

아래 샘플은 데이터 customer_data 대화는 두서없이 열

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 는 두 가지 문제가 있습니다. 그것은 수율을 개체의 목록과 일치하는 조건. 하지만 객체지 않는 부울,도 @@ 불행하고 반환 SQL NULL,취급되는 동일한 거짓으로 여기에. 대신,당신이 필요하다면 테스트는 목록은 비어 있습니다. 이것은 무엇인 @? 는,그래서 사용하는 대신 @@. 또한,날짜로 저장된 8 자리의 정수,하지만 당신은 그들에 비교 8-문자열. 에 jsonpath,간 이런 유형의 비교수익 JSON null,취급되는 동일한 거짓으로 여기에. 그래서 당신은 중 하나를 변경해야 하는 저장하는 문자열,또는 변경 리터럴 그들은 비교로 정수입니다.

세 번째 jsonpath 도 @@ 문제입니다. 와는 반대의 유형 문제가 있 pin_code 저장된 문자열로,하지만 당신은 그들을 테스트에 대해 정수입니다. 마지막으로 당신은'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ý
..................................................................................................................