programing

MariaDB: JSON_TABLE 없이 JSON 어레이에 액세스

powerit 2023. 6. 22. 22:32
반응형

MariaDB: JSON_TABLE 없이 JSON 어레이에 액세스

다음과 같은 데이터를 가진 JSON 필드가 있습니다.

[{"low": 57.07, "rsi": 0.0, "date": 1675935000000, "high": 57.07, "open": 57.07, "close": 57.07, "ema_7": 0.0, "ema_21": 0.0, "symbol": "ACPL", "volume": 0, "SUPERT_10_1_0": 0.0, "SUPERTd_10_1_0": 1, "SUPERTl_10_1_0": 0.0, "SUPERTs_10_1_0": 0.0}, {"low": 57.0, "rsi": 0.0, "date": 1675935900000, "high": 58.49, "open": 57.07, "close": 58.4, "ema_7": 0.0, "ema_21": 0.0, "symbol": "ACPL", "volume": 2500, "SUPERT_10_1_0": 0.0, "SUPERTd_10_1_0": 1, "SUPERTl_10_1_0": 0.0, "SUPERTs_10_1_0": 0.0}, {"low": 57.7, "rsi": 0.0, "date": 1675936800000, "high": 58.5, "open": 58.4, "close": 58.49, "ema_7": 0.0, "ema_21": 0.0, "symbol": "ACPL", "volume": 27000, "SUPERT_10_1_0": 0.0, "SUPERTd_10_1_0": 1, "SUPERTl_10_1_0": 0.0, "SUPERTs_10_1_0": 0.0}, {"low": 58.15, "rsi": 0.0, "date": 1675937700000, "high": 59.5, "open": 58.5, "close": 59.5, "ema_7": 0.0, "ema_21": 0.0, "symbol": "ACPL", "volume": 41000, "SUPERT_10_1_0": 0.0, "SUPERTd_10_1_0": 1, "SUPERTl_10_1_0": 0.0, "SUPERTs_10_1_0": 0.0}, {"low": 59.0, "rsi": 0.0, "date": 1675938600000, "high": 59.5, "open": 59.5, "close": 59.0, "ema_7": 0.0, "ema_21": 0.0, "symbol": "ACPL", "volume": 2500, "SUPERT_10_1_0": 0.0, "SUPERTd_10_1_0": 1, "SUPERTl_10_1_0": 0.0, "SUPERTs_10_1_0": 0.0}]

다음 질문은 저에게 완벽하게 적용됩니다.

SELECT indicators_15.symbol,indicators_15.open,indicators_15.close
FROM indicators_15, 
     JSON_TABLE(data, '$[*]' COLUMNS (
                close DOUBLE  PATH '$.close',
                open DOUBLE PATH '$.open')
     ) indicators_15;

하지만 내 호스팅인 네임싸이는 이전 버전의 마리아DB를 사용하고 있어서 실패하고 있습니다.JSON_TABLE이 아닌 동등한 버전을 어떻게 생각할 수 있습니까?

다음은 원하는 출력입니다.

enter image description here

이전 버전의 MariaDB에서 이 작업을 수행하려면 숫자 표가 필요합니다.

CREATE TABLE numbers ( number INT UNSIGNED PRIMARY KEY );
INSERT INTO numbers (number) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

필요에 따라 JSON 배열의 최대 길이까지 더 많은 숫자를 삽입합니다.

그런 다음 이 숫자를 사용하여 JSON 배열에서 n번째 항목을 추출할 수 있습니다.

SELECT i.symbol, 
  JSON_EXTRACT(i.data, CONCAT('$[', o.number, '].open')) AS open,
  JSON_EXTRACT(i.data, CONCAT('$[', o.number, '].close')) AS close
FROM indicators_15 AS i
JOIN numbers AS o ON o.number < JSON_LENGTH(i.data);

MariaDB 10.5를 사용한 DBfiddle.

이것이 명확하지 않으면 알려주시면 제가 더 설명해 드리겠습니다.


이것은 관계형 데이터베이스에서 JSON을 사용하는 것이 얼마나 나쁜 생각인지를 보여줍니다.모든 배열 항목의 필드가 동일하기 때문에 예제에서 JSON을 사용할 이유가 없습니다.필드를 예측할 수 없는 경우 JSON을 사용합니다.모든 레코드에서 필드가 동일한 경우 일반 행과 열을 사용합니다.개발자가 JSON 사용 방법을 이해하지 못하거나 JSON 기능을 충분히 지원하지 않는 이전 버전의 소프트웨어를 사용해야 하는 경우 JSON이 필요하지 않은 곳에서 JSON을 사용하는 것은 소프트웨어 프로젝트의 개발 시간을 증가시켜 개발 비용을 증가시킬 뿐입니다.

언급URL : https://stackoverflow.com/questions/75414674/mariadb-accessing-json-array-without-json-table

반응형