我有一个运行参数化 GBQ 查询的服务,其中包含用户发送的一些值。 如果用户没有发送值,它应该运行查询而不进行过滤。
这是构建查询参数的代码片段:
const params = {
someIds: this.someIds,
someNames : this.userInput.someNames ? this.userInput.someNames : [],
};
如果 userInput.someNames 包含值,查询将按预期运行。但是当它获取一个空数组作为参数时,GBQ 会抛出错误:
Cannot read properties of undefined (reading 'length')
这是我尝试过的查询片段 - 它们都不起作用,每次数组为空时都会出现相同的错误:
SELECT
some_id,
some_name,
date_time,
RANK() OVER (PARTITION BY some_name, date_time ORDER BY some_field_name DESC) AS ranked,
some_field_name
FROM
db_name.table_name
WHERE
some_id IN UNNEST ( @someIds )
AND ((ARRAY_LENGTH(@someNames ) IS NULL
OR ARRAY_LENGTH(@someNames ) = 0)
OR @someNames IS NULL
OR some_name IN UNNEST(@someNames ))
SELECT
some_id,
some_name,
date_time,
RANK() OVER (PARTITION BY some_name, date_time ORDER BY some_field_name DESC) AS ranked,
some_field_name
FROM
db_name.table_name
WHERE
some_id IN UNNEST ( @someIds )
AND
CASE
WHEN @someNames IS NULL THEN TRUE
WHEN ARRAY_LENGTH(@someNames ) = 0 THEN TRUE
ELSE some_name IN UNNEST(@someNames)
END
我还尝试传递 null 而不是空数组,但没有成功。如何解决这个问题?
通过向查询选项添加可选的“类型”参数解决了问题
const options = {
query,
location: 'US',
params,
types: {someNames :['string']}, //use this for empty arrays identification
};