2017-11-14 2 views
1

私は3つの "コード"フィールドを含むbigqueryテーブルを持っています。これらのフィールドのいくつかは、コードテーブルを参照するために使用されます。テーブルを想定は次のようになります。ルックアップを実行するためにbigqueryの値にcolumnnameを追加するには

data table: 
    id code1 code2  code3  data1 
    1  Y  3   A  IA 
    2  Y  2   B  IB 
    3  N  5   C  IC 

、私はコロンで区切られた値にFIELD_NAMEをCONCATする必要があります。列名はハードコードできません。大きなクエリを使用すると、テーブルオブジェクトを使用してselect文の中でカラム名を推測する方法はありますか?例えば

select * from code_table join data_table where code1 = code.code_values 
the value of code1 coming out is 'code1:Y' not 'Y'. 

それはcode_tableに出て起こっているようCODE1値で動的にCOLUMN_NAMEを注入する方法があります場合、私は思ったんだけど。

UPDATE 1:

ここcode_tableに対して参加するdata_tableからの出力例だ:

1, code1:Y, code2:3, code3:A, IA 
2, code1:Y, code2:2, code3:B, IB 
3, code1:N, code2:5, code3:C, IC 

おかげ

+0

あなたは「私は列名をハードコードできません」ということを明確にすることはできますか? –

答えて

2

は、所望の出力を与えるTO_JSON_STRING機能を使用していますか?

WITH `project.dataset.table` AS (
    SELECT 1 AS id, 'Y' AS code1, 3 AS code2, 'A' AS code3, 'IA' AS data1 UNION ALL 
    SELECT 2, 'Y', 2, 'B', 'IB' UNION ALL 
    SELECT 3, 'N', 5, 'C', 'IC' 
) 
SELECT REPLACE(TO_JSON_STRING(t), '"', '') AS json 
FROM `project.dataset.table` AS t; 
+-----------------------------------------+ 
| json         | 
+-----------------------------------------+ 
| {id:1,code1:Y,code2:3,code3:A,data1:IA} | 
| {id:2,code1:Y,code2:2,code3:B,data1:IB} | 
| {id:3,code1:N,code2:5,code3:C,data1:IC} | 
+-----------------------------------------+ 

編集:これは、正確な所望の出力を与える

WITH `project.dataset.table` AS (
    SELECT 1 AS id, 'Y' AS code1, 3 AS code2, 'A' AS code3, 'IA' AS data1 UNION ALL 
    SELECT 2, 'Y', 2, 'B', 'IB' UNION ALL 
    SELECT 3, 'N', 5, 'C', 'IC' 
) 
SELECT TO_JSON_STRING(t) AS json 
FROM `project.dataset.table` AS t; 
+---------------------------------------------------------+ 
| json             | 
+---------------------------------------------------------+ 
| {"id":1,"code1":"Y","code2":3,"code3":"A","data1":"IA"} | 
| {"id":2,"code1":"Y","code2":2,"code3":"B","data1":"IB"} | 
| {"id":3,"code1":"N","code2":5,"code3":"C","data1":"IC"} | 
+---------------------------------------------------------+ 

あなたが引用符を取り除くしたい場合は、あなたもそれを行うことができます:ここではあなたのデータを使用した例です。私はあなたが同じ方法でそれらをフォーマットしたくないように聞こえるので、iddataを参照することで大丈夫だと仮定しています。

WITH `project.dataset.table` AS (
    SELECT 1 AS id, 'Y' AS code1, 3 AS code2, 'A' AS code3, 'IA' AS data1 UNION ALL 
    SELECT 2, 'Y', 2, 'B', 'IB' UNION ALL 
    SELECT 3, 'N', 5, 'C', 'IC' 
) 
SELECT 
    REGEXP_REPLACE(
    FORMAT(
     '%d %s %s', 
     id, 
     REGEXP_REPLACE(
     TO_JSON_STRING(
      (SELECT AS STRUCT t.* EXCEPT (id, data1)) 
     ), 
     '["{}]', ''), 
     data1 
    ), 
    r'[ ,]', ', ' 
) AS output 
FROM `project.dataset.table` AS t; 
+----------------------------------+ 
| output       | 
+----------------------------------+ 
| 1, code1:Y, code2:3, code3:A, IA | 
| 2, code1:Y, code2:2, code3:B, IB | 
| 3, code1:N, code2:5, code3:C, IC | 
+----------------------------------+ 
+0

私はそこに着いた、私は何を探しているの更新を入れている – arcee123

+0

私は希望の出力を与えるために私の答えを更新しました。 –

+0

これは素晴らしいです!これは大いに役立ちます。とにかくテーブルで定義されているように出力を列に分割することはありますか?ありがとう。 – arcee123

1
#standardSQL 
WITH `project.dataset.table` AS (
    SELECT 1 AS id, 'Y' AS code1, 3 AS code2, 'A' AS code3, 'IA' AS data1 UNION ALL 
    SELECT 2, 'Y', 2, 'B', 'IB' UNION ALL 
    SELECT 3, 'N', 5, 'C', 'IC' 
) 
SELECT 
    id, 
    MAX(IF(col = 1, val, NULL)) AS col1, 
    MAX(IF(col = 2, val, NULL)) AS col2, 
    MAX(IF(col = 3, val, NULL)) AS col3, 
    data1 
FROM `project.dataset.table` AS t, UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'"|{|}', ''))) AS val WITH OFFSET col 
WHERE col BETWEEN 1 AND 3 
GROUP BY id, data1 
ORDER BY id 

それはあなたが2以上を追加する必要があります(例えば)5であるので、もしあなただけのコード列の数を知っておく必要があります上記のクエリと

id col1  col2  col3  data1  
1 code1:Y  code2:3  code3:A  IA 
2 code1:Y  code2:2  code3:B  IB 
3 code1:N  code2:5  code3:C  IC  

以下のように出力SELECTと変更BETWEEN 1 AND 3BETWEEN 1 AND 5

+0

こんにちはミハイル。もう一度あなたの天才に感謝します。 '' col = 1 ....''は2番目の列を意味します(ゼロから始まる?)。ありがとう! – arcee123

+0

が正しいです!col = 1は2番目の列を意味します(ゼロから始まります) –

関連する問題