BigQuery ARRAY_TO_STRING 基于非数组字段中的条件

BigQuery ARRAY_TO_STRING based on condition in non-array field

我有一个 table 我这样查询...

select *
from table
where productId = 'abc123'

其中 returns 2 行(即使 productId 是唯一的)因为其中一列 (orderName) 是一个数组...

**productId, productName, created, featureCount, orderName**
abc123, someProductName, 2020-01-01, 12, someOrderName
      ,                ,           ,   , someOtherOrderName

由于 orderName 数组扩展我的搜索结果的方式,我不确定第二行中缺失的值是空字符串还是 null,但我现在想 运行 这样的查询.. .

select productName, ARRAY_TO_STRING(orderName,'-')
from table
where productId = 'abc123'
and ifnull(featureCount,0) > 0

但是这个查询 returns...

someProductName, someOrderName-someOtherOrderName

即即使我指定了 featureCount>0.

的条件,两个数组值都返回了

我确定我遗漏了一些关于数组如何在 BigQuery 中运行的非常基本的东西,但是从 Google 的 ARRAY_TO_STRING 文档中我看不到任何方法来向提取数组值。感谢任何有关解决此问题的最佳方法的想法。

据我了解,这是因为您只是查询一行数据,其中有一列为 ARRAY<STRING>。当您使用 ARRAY_TO_STRINGS 时,它将只接受 ARRAY<STRING> 值,您会看到所有数组值只适合一个单元格。

因此,当您 运行 您的脚本时,您的输出将符合您的标准,并且 return 带有数组的列带有额外的行以供查看。

UI 上的可视化应该类似于您在问题中提到的内容:

Row productId productName created featureCount orderName
1 abc123 someProductName 2020-01-01 12 someOrderName
someOtherOrderName

注意:在 bigquery 上,此附加行显示为灰色( ),它是第 1 行的一部分,但它显示为附加行以提高可见性。所以这个输出在 table.

中只有 1 行

JSON 上的可视化将是:

[
  {
    "productId": "abc123",
    "productName": "someProductName",
    "created": "2020-01-01",
    "featureCount": "12",
    "orderName": [
      "someOrderName",
      "someOtherOrderName"
    ]
  }
]

我认为没有关于如何在 UI 上可视化数组的具体文档信息,但我可以分享讨论如何​​ flattening 您的行输出到单行行的文档, 检查:

我使用以下方法来复制您的问题:

CREATE OR REPLACE TABLE `project-id.dataset.working_table` (
 productId STRING,
 productName STRING,
 created STRING,
 featureCount STRING,
 orderName ARRAY<STRING>
);

insert into `project-id.dataset.working_table` (productId,productName,created,featureCount,orderName) 
values ('abc123','someProductName','2020-01-01','12',['someOrderName','someOtherOrderName']);
 
insert into `project-id.dataset.working_table` (productId,productName,created,featureCount,orderName) 
values ('abc123X','someProductNameX','2020-01-02','15',['someOrderName','someOtherOrderName','someData']);
 

产出

Row productId productName created featureCount orderName
1 abc123 someProductName 2020-01-01 12 someOrderName
someOtherOrderName
2 abc123X someProductNameX 2020-01-02 15 someOrderName
someOtherOrderName
someData

注意:Table 包含 2 行。