将列中的行值与BIGQUERY中其他列的名称匹配

时间:2019-03-22 22:54:51

标签: sql google-bigquery

在bigquery中,有没有一种方法可以执行“ L”操作?说哪里:

  +----------------+---------------+----------------+
  |     COL1       |      COL2     | FOO            |
  +----------------+---------------+----------------+
  | identif11      |   BAR         |     VALUE1     | 
  | identif22      |    FOO        |     VALUE2     | 
  +----------------+---------------+----------------+

如果(COL2)中的值与(FOO)中的(FOO)返回值匹配,并且可以将其添加到新列中。

我是SQL方面的新秀,我可以在python中做到这一点,但是我正在处理数百万行的数据集,因此我需要更强大的功能

L-operator(COL1,FOO)应该在第二行中返回VALUE2。

1 个答案:

答案 0 :(得分:3)

以下是用于BigQuery标准SQL

  

选项1

#standardSQL
SELECT col1, col2, foo, bar, 
  CASE col2 
    WHEN 'BAR' THEN bar
    WHEN 'FOO' THEN foo
  END L
FROM `project.dataset.table` t

您可以使用问题中的示例数据进行测试,操作

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'identif11' col1, 'BAR' col2, 'VALUE1' foo, 'VALUE3' bar UNION ALL
  SELECT 'identif22', 'FOO', 'VALUE2', 'VALUE4'
)
SELECT col1, col2, foo, bar, 
  CASE col2 
    WHEN 'BAR' THEN bar
    WHEN 'FOO' THEN foo
  END L
FROM `project.dataset.table` t   

有结果

Row col1        col2    foo     bar     L    
1   identif11   BAR     VALUE1  VALUE3  VALUE3   
2   identif22   FOO     VALUE2  VALUE4  VALUE2   
  

选项2

您可以在上面进行一些“重构”-通过使用下面的示例中的SQL UDF

#standardSQL
CREATE TEMP FUNCTION L(val STRING, t ANY TYPE) AS (
  CASE val 
    WHEN 'BAR' THEN t.bar
    WHEN 'FOO' THEN t.foo
  END  
);
WITH `project.dataset.table` AS (
  SELECT 'identif11' col1, 'BAR' col2, 'VALUE1' foo, 'VALUE3' bar UNION ALL
  SELECT 'identif22', 'FOO', 'VALUE2', 'VALUE4' UNION ALL
  SELECT 'identif22', 'AAA', 'VALUE2', 'VALUE4'
)
SELECT col1, col2, foo, bar, L(col2, t) L
FROM `project.dataset.table` t   

有结果

Row col1        col2    foo     bar     L    
1   identif11   BAR     VALUE1  VALUE3  VALUE3   
2   identif22   FOO     VALUE2  VALUE4  VALUE2   
3   identif22   AAA     VALUE2  VALUE4  null     
  

选项3

最后,不需要预先知道并在代码中显式引用列名的版本

#standardSQL
CREATE TEMP FUNCTION L(val STRING, t ANY TYPE) AS (
  REGEXP_EXTRACT(
    TO_JSON_STRING(t),
    CONCAT(r'(?i)"', val, '":"?([^"}]+)"?')
  ) 
);
SELECT col1, col2, foo, bar, L(col2, t) L
FROM `project.dataset.table` t   

注意:第3个选项尚未经过全面测试,可能会有一些极端情况-但对于示例数据中的简单情况-应该可以很好地工作