我有以下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.params
对CONCAT
的所有行执行字符串操作。内部查询执行后,只需执行字符串操作,然后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)
是一个变量。
答案 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';