web-dev-qa-db-ja.com

BigQueryで文字列列を分割する

BigQueryに2つの列を含むテーブルがあるとしましょう。最初の列は名前を表し、2番目の列は任意の長さの値の区切りリストです。例:

Name | Scores
-----+-------
Bob  |10;20;20
Sue  |14;12;19;90
Joe  |30;15

次のように、最初が名前で、2番目が単一のスコア値である列に変換したいと思います。

Name,Score
Bob,10
Bob,20
Bob,20
Sue,14
Sue,12
Sue,19
Sue,90
Joe,30
Joe,15

これはBigQueryだけで実行できますか?

13
David M Smith

みなさん、朗報です! BigQueryがSPLIT()!できるようになりました


" データセットの複数の行に表示される2つのWordフレーズをすべて検索 "を見てください。

BigQueryで値をsplit()して文字列から複数の行を生成する現在の方法はありませんが、正規表現を使用してコンマを探し、最初の値を見つけることができます。次に、同様のクエリを実行して2番目の値を見つけます。上記の例で示したパターン(コンマによるUNION)を使用して、これらすべてを1つのクエリにマージできます。

13
Felipe Hoffa

誰かがまだ答えを探しているなら

select Name,split(Scores,';') as Score
from (
      # replace the inner custome select with your source table
      select *
      from 
      (select 'Bob' as Name ,'10;20;20' as Scores),
      (select 'Sue' as Name ,'14;12;19;90' as Scores),
      (select 'Joe' as Name ,'30;15' as Scores)
);
9
Elad Ben Akoune

書き直そうとすると Elad Ben Akouneの答え Standart SQLでは、クエリは次のようになります。

WITH name_score AS (
SELECT Name, split(Scores,';') AS Score
FROM (
      (SELECT * FROM (SELECT 'Bob' AS Name ,'10;20;20' AS Scores)) 
      UNION ALL 
      (SELECT * FROM (SELECT 'Sue' AS Name ,'14;12;19;90' AS Scores))
      UNION ALL
      (SELECT * FROM (SELECT 'Joe' AS Name ,'30;15' AS Scores))
)) 
SELECT name, score
FROM name_score
CROSS JOIN UNNEST(name_score.score) AS score;

そして、この出力。

+------+-------+
| name | score |
+------+-------+
| Bob  | 10    |
| Bob  | 20    |
| Bob  | 20    |
| Sue  | 14    |
| Sue  | 12    |
| Sue  | 19    |
| Sue  | 90    |
| Joe  | 30    |
| Joe  | 15    |
+------+-------+
8
az3