3

json-object を含む列を持つテーブルがあります。値の型は常に文字列です。

2種類の情報が必要です:

  • json キーのリスト
  • json をキーと値のペアの配列に変換します

これは私がこれまでに得たもので、機能しています:

CREATE TEMP FUNCTION jsonObjectKeys(input STRING)
RETURNS Array<String>
LANGUAGE js AS """
  return Object.keys(JSON.parse(input));
""";

CREATE TEMP FUNCTION jsonToKeyValueArray(input STRING)
RETURNS Array<Struct<key String, value String>>
LANGUAGE js AS """
  let json = JSON.parse(input);
  return Object.keys(json).map(e => {
    return { "key" : e, "value" : json[e] }
  });
""";

WITH input AS (
  SELECT "{\"key1\": \"value1\", \"key2\": \"value2\"}" AS json_column
  UNION ALL
  SELECT "{\"key1\": \"value1\", \"key3\": \"value3\"}" AS json_column
  UNION ALL
  SELECT "{\"key5\": \"value5\"}" AS json_column
)

SELECT
  json_column,
  jsonObjectKeys(json_column) AS keys,
  jsonToKeyValueArray(json_column) AS key_value
FROM input

問題はFUNCTION、コンピューティングの最適化の点で最適ではないことです。そのため、関数なしの SQL のみを使用してこれら 2 つのニーズ (または少なくとも 1 つ) を達成するためにプレーン SQL を使用する方法があるかどうかを理解しようとしています。 .

4

1 に答える 1