2016-11-21 21 views
0

サーバーから送信された生のJSONデータを含む文字列フィールドがあります。ただし、キーに括弧が含まれているため、データを抽出しようとすると問題が発生するようです。json_extract_scalarがキー名のかっこで失敗する

データサンプル:

{"Interview (Onsite)": "2015-04-06 16:58:28"} 

抽出の試み:

timestamp(max(json_extract_scalar(a.status_history, '$.Interview (Onsite)'))) 

status_history繰り返しフィールドであるとして '最大' 関数が使用されている)

エラー:

JSONPath parse error at: (Onsite) 

私はかっこをエスケープする一般的な方法をいくつか試しましたが、それはどこにもありません。

私は真に必要な場合を除き、私はむしろ正規表現に頼らない方がよいでしょう。

答えて

0

standard SQL(UIの[表示オプション]の下にある[Use Legacy SQL]のチェックを外す)を有効にした後は、引用符付きの文字列をJSONパスの一部として使用できます。たとえば、次のように

SELECT 
    CAST(JSON_EXTRACT_SCALAR(
    '{"Interview (Onsite)": "2015-04-06 16:58:28"}', 
    "$['Interview (Onsite)']") AS TIMESTAMP) AS t; 

編集:あなたはARRAY<STRING>である列を持っているので、あなたが各要素にJSON_EXTRACT_SCALARを適用するARRAYサブクエリを使用する必要があります。

また
WITH T AS (
    SELECT 
    ['{"Interview (Onsite)": "2015-04-06 16:58:28"}', 
    '{"Interview (Onsite)": "2015-11-16 08:09:10"}', 
    '{"Interview (Onsite)": "2016-01-01 18:12:43"}'] 
    AS status_history UNION ALL 
    SELECT 
    ['{"Interview (Onsite)": "2016-06-25 07:01:45"}'] 
) 
SELECT 
    ARRAY (
    SELECT CAST(JSON_EXTRACT_SCALAR(history, "$['Interview (Onsite)']") AS TIMESTAMP) 
    FROM UNNEST(status_history) AS history 
) AS interview_times 
FROM T; 

、あなたは配列の構造を維持する気にしないならば、あなたはstatus_historyの各要素ごとに1行を返します。これは、参加して、それを「フラット化」することができます:たとえば

WITH T AS (
    SELECT 
    ['{"Interview (Onsite)": "2015-04-06 16:58:28"}', 
    '{"Interview (Onsite)": "2015-11-16 08:09:10"}', 
    '{"Interview (Onsite)": "2016-01-01 18:12:43"}'] 
    AS status_history UNION ALL 
    SELECT 
    ['{"Interview (Onsite)": "2016-06-25 07:01:45"}'] 
) 
SELECT 
    CAST(JSON_EXTRACT_SCALAR(history, "$['Interview (Onsite)']") AS TIMESTAMP) 
    AS interview_time 
FROM T CROSS JOIN UNNEST(status_history) AS history; 

section of the migration guide on handling of repeated fieldsも参照してください。

+0

レガシーSQLで実行できますか?このフィールドは繰り返しのSTRINGフィールドで、JSON_EXTRACT_SCALARは文字列配列では機能しません。 –

+0

私の答えは更新されました。これが役立つかどうかを見てください。 –

関連する問題