【问题标题】:Cast in Google BigQuery not appropriate?在 Google BigQuery 中投射不合适?
【发布时间】:2018-12-13 01:15:47
【问题描述】:

我有一个#StandardSQL 查询

 SELECT
    CAST(created_utc AS STRING),
    author,
 FROM
    `table`
 WHERE
   something = "Something"

这给了我以下错误,

Error: Cannot read field 'created_utc' of type STRING as INT64

created_utc 的一个例子是 1517360483

如果我明白那个错误,我显然不明白。 created_utc 存储了一个字符串,但查询未成功地将其转换为 INT64。我本来希望 CAST 函数将强制它保存为字符串。

我做错了什么?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    问题是您实际上没有一张桌子。在您的问题中,您写了table,但我怀疑您正在查询table*,它匹配多个表,其中一个表恰好具有该列的不同类型。不使用table*,您的选择是:

    • 将 UNION ALL 与各个表一起使用,在 SELECT 列表中执行适当的强制转换。
    • 如果您知道哪些表将该列作为 INT64 而不是 STRING,并且您可以排除它们,则可以在 _TABLE_SUFFIX 上使用过滤器来跳过从某些表中读取。

    【讨论】:

      【解决方案2】:

      正如 Elliott 已经指出的那样 - 您的某些值实际上不能转换为 INT64,因为它们不是表示整数,而是有一些其他字符而不是数字

      使用下面的 SELECT,您可以识别这些值,以便帮助您找到有问题的条目,然后决定下一步操作

      #standardSQL
      SELECT created_utc, author
      FROM `table`
      WHERE something = "Something"
        AND NOT REGEXP_CONTAINS(created_utc , r'[0-9]')
      

      【讨论】:

      • 值本身可能是有效的整数,但通配符匹配的表中的列类型不一样,因此不幸的是,这个查询也会导致同样的错误。跨度>
      • 同意这个猜测,但我们不知道到底是什么问题——对吧? :o) 所以我的回答更多是为了排除故障......
      • @ElliottBrossard - 看起来我们两个人今天在这里值班 :o) 7 月 4 日快乐!
      猜你喜欢
      • 2019-01-16
      • 2017-12-17
      • 1970-01-01
      • 2017-01-07
      • 2014-03-15
      • 2017-10-09
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多