NodeJS 实现中的 BigQuery 不接受参数化查询中的空数组

问题描述 投票:0回答:1

我有一个运行参数化 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 而不是空数组,但没有成功。如何解决这个问题?

node.js google-bigquery
1个回答
0
投票

通过向查询选项添加可选的“类型”参数解决了问题

const options = {
      query,
      location: 'US',
      params,
      types: {someNames :['string']}, //use this for empty arrays identification
                };
© www.soinside.com 2019 - 2024. All rights reserved.