programing

특정 자식 값의 부모 키를 가져오는 mariadb json 쿼리

goodsources 2022. 9. 12. 11:53
반응형

특정 자식 값의 부모 키를 가져오는 mariadb json 쿼리

계약서를 json 형식으로 mariadb 데이터베이스(10.3.21)에 저장한 클라이언트를 받았습니다.

부모 키는 계약형태의 아이디입니다. cb = 체크박스를 켜면 (1), (0), p & pt는 가격관련으로 제 질문과는 관련이 없습니다.

단순화된 json 형식은 다음과 같이 구성됩니다.

{
    "1": {
        "cb": "0",
        "p": "1",
        "pt": "m"
    },
    "2": {
        "cb": "1",
        "p": "395",
        "pt": "y"
    },
    "3": {
        "cb": "0",
        "p": "",
        "pt": "m"
    },
    "7": {
        "cb": "1",
        "p": "120",
        "pt": "m"
    }
}

특정 계약 유형을 가진 모든 회사의 결과를 얻을 수 있도록 데이터베이스를 조회할 수 있습니다.

SELECT
       `id`
     , `company`
FROM
       `db`.`clients`
WHERE
       JSON_VALUE(`contracts`, '$.2.cb')=1

그러나 나는 json을 쿼리하고 싶다. 그래서 나는 아이 키 cb = 1인 부모 키 배열을 얻을 수 있다.["2","7"]이 json의 결과입니다.

따라가는 줄 알았는데 안 되네.기대했던 결과 대신 빈 결과 세트를 얻는 것.

SELECT
       `id`
     , `company`
     , JSON_QUERY(`contracts`, '$') AS `contracttypes`
FROM
       `db`.`clients`
WHERE
       JSON_VALUE(`contracts`, '$.%.cb')=1

경로에서 와일드카드가 가능한지 여부 및 가능한 경우 구문을 찾을 수 없으므로 원하는 결과를 얻을 수 있습니다.

대체 어프로치

다른 방법을 시도했지만 더 나은 결과를 얻지는 못했습니다.

SELECT
       `id`
     , `company`
     , json_search(`contracts`,'all','1') AS `contracttypes`
FROM
       `db`.`clients`

결과:["$.1.p", "$.2.cb", "$.7.cb"]cb 아이템의 키는 제가 원하는 것이지만, p 아이템으로 인한 첫 번째 키는 원하지 않습니다.

하려고 하다json_search다음과 같은 값을 가진 키에서 null 결과를 제공합니다.

json_search(`contracts`,'all','"cb":"1"')

/* or with curlies */

json_search(`contracts`,'all','{"cb":"1"}')

시험:

SELECT
  REGEXP_REPLACE(
    JSON_SEARCH(@`json`, 'all', '1', NULL, '$**.cb'),
    '[$.]|[.cb]',
    SPACE(0)
  ) `json_result`;

dbfiddle 참조.

언급URL : https://stackoverflow.com/questions/59987395/mariadb-json-query-to-get-parent-keys-of-specific-child-value

반응형