有没有更好的方法来编写此BigQuery Sql?

时间:2020-09-15 10:45:37

标签: sql database google-bigquery

我有以下SQL


SELECT CONCAT('method', ' ', r_type, ' ',
r_schema, '.', r_name,
(SELECT
CASE (
      SELECT count(*)
      FROM myDataset.params
      WHERE s_name= 'fileName'
     )
WHEN 0 THEN '()'
ELSE
  (
    SELECT CONCAT('(', STRING_AGG(CONCAT(p_mode, ' ',  p_name, ' ', p_type), ', '),  ')')
    FROM myDataset.params
    WHERE s_name = 'fileName'
  )
END)
, '\n', r_definition, '\n')
FROM myDataset.routines
WHERE r_name = 'fileName';

它会输出以下结果。


method r_type r_schema.r_name(p_mode p_name p_type, ... so on) 
r_body

内部查询的作用是,首先通过检查其计数来检查fileName中是否存在myDataset.params。如果为零,则返回()进行串联,否则返回myDataset.paramsCONCAT的所有行执行字符串操作。内部查询执行后,只需执行字符串操作,然后myDataset.routine的投影就fileName

我想问的是在BigQuery中是否有更好的方法(更少的代码)编写此查询。我的意思是查询正在执行其工作,但仍然如此。

PS:字符串execute 'rootSH' do user 'root' command "sh root.sh" cwd "/path/to/root.sh" # ENTER THE PATH TO ROOT.SH HERE live_stream true end.run_action(:run) 是一个变量。

1 个答案:

答案 0 :(得分:1)

SELECT CASE可以用COALESCE调用代替,因为当存在匹配的行时,CONCAT(p_mode, ' ', p_name, ' ', p_type)的输出将永远不会是NULL

SELECT    CONCAT('method', ' ', r_type, ' ', r_schema, '.', r_name,
           (SELECT COALESCE(CONCAT('(', 
                     STRING_AGG( 
                       CONCAT(p_mode, ' ',  p_name, ' ', p_type),
                       ', '), 
                     ')'),
                   '()')
            FROM   myDataset.params
            WHERE  s_name = 'fileName'),  
          '\n', r_definition, '\n')
FROM      myDataset.routines
WHERE     r_name = 'fileName';

此外,您可以尝试使用LEFT JOIN而不是子查询...这取决于最后的WHERE子句是否是动态的(是否总是“ fileName”?):

SELECT    CONCAT('method', ' ', r_type, ' ', r_schema, '.', r_name,
                 mode_name_type, '\n', r_definition, '\n')
FROM      myDataset.routines r
LEFT JOIN (
            SELECT COALESCE(CONCAT('(', 
                     STRING_AGG( 
                       CONCAT(p_mode, ' ',  p_name, ' ', p_type),
                       ', '), 
                     ')'),
                   '()') mode_name_type,
                   s_name
            FROM   myDataset.params
            GROUP BY s_name
          ) p on p.s_name = r.r_name 
WHERE     r.r_name = 'fileName';