【问题标题】:How do you query an array in Standard SQL that meets a certain conditional?如何在标准 SQL 中查询满足某个条件的数组?
【发布时间】:2019-09-02 14:39:36
【问题描述】:

我正在尝试提取数组只满足特定条件的记录。

例如,我只想要包含“IAB3”的结果。

这是表格的样子

表名:

出价

列名:

BidderBanner / WinCat

参赛作品:

1600402 / null
1911048 / null
1893069 / [IAB3-11, IAB3]
1214894 / IAB3

我最初的想法是这样的

SELECT * FROM bids WHERE WinCat = "IAB3" 

但我收到一个错误,指出与运算符类型数组、字符串不匹配。

该数据库位于 Google Big Query 中。

【问题讨论】:

  • 您使用的是什么数据库? “标准 SQL”不支持数组。
  • 您可能会发现LIKE 很有帮助。

标签: sql arrays google-bigquery where


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT * FROM `project.dataset.bids` WHERE 'IAB3' IN UNNEST(WinCat)

您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示

#standardSQL
WITH `project.dataset.bids` AS (
  SELECT 1600402 BidderBanner, NULL WinCat UNION ALL
  SELECT 1911048, NULL UNION ALL
  SELECT 1893069, ['IAB3-11', 'IAB3'] UNION ALL
  SELECT 1214894, ['IAB3'] 
)
SELECT * FROM `project.dataset.bids` WHERE 'IAB3' IN UNNEST(WinCat)  

结果

【讨论】:

    【解决方案2】:

    这将起作用:

    SELECT * FROM bids WHERE REGEXP_LIKE (WinCat, '(.)*(IAB3)+()*'); 
    

    【讨论】:

      【解决方案3】:

      一种方法使用unnest(),如下所示:

      SELECT b.*
      FROM bids b
      WHERE 'IAB3' IN (SELECT unnest(b.WinCats))
      

      但是,数组语法因支持它们的数据库而异,它们不是“标准 SQL”的一部分。

      【讨论】:

        【解决方案4】:

        您需要在 sql 中为所有字符串使用单引号。它应该是 WHERE WinCat = 'IAB3' 而不是 WHERE WinCat = "IAB3"

        猜你喜欢
        • 2016-12-28
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 2013-12-19
        • 2014-10-20
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多