2017-11-14 1 views
1

Ich habe eine bigquery Tabelle, die 3 "Code" Felder enthält. Einige dieser Felder werden verwendet, um nach einer Codetabelle zu suchen. Angenommen, die Tabelle sieht wie folgt aus:Wie man den Spaltennamen zum Wert in bigquery hinzufügt

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

, um die Suche durchzuführen, ich habe die field_name auf den Wert verketten, durch einen Doppelpunkt getrennt. Ich kann den Spaltennamen nicht fest codieren. Gibt es eine große Abfrage, gibt es eine Möglichkeit, das Tabellenobjekt zu verwenden, um den Spaltennamen innerhalb der SELECT-Anweisung abzuleiten?

zum Beispiel:

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

Ich frage mich, ob es einen Weg, um die Spalten_Name dynamisch im code1 Wert zu injizieren, wie es um die code_table Ausgehen wird.

UPDATE 1:

Hier ist ein Beispiel für die Ausgabe von data_table gegen code_table beizutreten:

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

Dank

+0

können Sie klären - was meinen Sie mit "Ich kann den Spaltennamen nicht fest codieren"? –

Antwort

2

Hat mit der TO_JSON_STRING Funktion der gewünschten Ausgabe geben? Hier ist ein Beispiel Ihre Daten mit:

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"} | 
+---------------------------------------------------------+ 

Wenn Sie die Anführungszeichen Streifen aus, können Sie das auch tun:

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} | 
+-----------------------------------------+ 

Edit: dies die genaue gewünschte Ausgabe gibt. Ich gehe davon aus, dass Sie mit id und data Namen namentlich in Ordnung sind, da es klingt, als ob Sie sie nicht auf die gleiche Weise formatieren möchten.

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

Ich kam dorthin, ich stelle ein Update von dem, was ich suche – arcee123

+0

Ich aktualisierte meine Antwort, um die gewünschte Ausgabe zu geben. –

+0

DAS IST FANTASTISCH !!! das hilft viel. Gibt es trotzdem eine Aufteilung der Ausgabe auf die Spalten wie in der Tabelle definiert? Vielen Dank. – 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 

Ausgang wie unten

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  

mit über Abfrage, die Sie gerade benötigen Anzahl von Code Spalten wissen, so dass, wenn es 5 (zum Beispiel) ist, dass Sie zwei weitere hinzufügen müssen in SELECT und ändern BETWEEN 1 AND 3 zu BETWEEN 1 AND 5

+0

Hallo Mikhail. Danke nochmal für dein Genie. Wie ordne ich die Spaltennummern in 'MAX (IF (col =? ....' zu den Spalten? Bedeutet 'col = 1 'zweite Spalte (beginnend mit Null?). Danke! – arcee123

+0

das ist richtig! Col = 1 mittlere zweite Spalte (beginnend mit Null) –

Verwandte Themen