BigQuery在标准模式下使用regex_extract_all选择别名

时间:2016-06-05 22:43:27

标签: sql google-bigquery

我无法在BigQuery(标准模式)中引用SELECT别名。

尝试执行此查询:

SELECT
  REGEXP_EXTRACT_ALL(text,
    r"(<div \w+>)") AS matches
FROM
  regex.test
WHERE
  matches IS NOT NULL

以下是重现的步骤。

bq mk regex
bq mk -t regex.test id:integer,text:string
echo '{"id":1, "text":"<div a>"}' | bq insert regex.test
echo '{"id":2, "text":"<div b>"}' | bq insert regex.test
echo '{"id":3, "text":"<div>"}' | bq insert regex.test

bq query --use_legacy_sql=false "select REGEXP_EXTRACT_ALL(text, r\"(<div \w+>)\") AS matches FROM regex.test WHERE id IS NOT NULL"

+--------------+
|   matches    |
+--------------+
| [u'<div b>'] |
| []           |
| [u'<div a>'] |
+--------------+

当我尝试引用matches别名时,我看到一个错误:

bq query --use_legacy_sql=false "select REGEXP_EXTRACT_ALL(text, r\"(<div \w+>)\") AS matches FROM regex.test WHERE matches IS NOT NULL"
Error in query string: Error processing job 'myname': Unrecognized name:
matches

我无法引用别名matches,因此无法过滤这些结果WHERE matches IS NOT NULL

有谁知道我在这里做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

即使在BQ中,也不能在where子句中使用列别名。只需使用子查询:

SELECT t.*
FROM (SELECT REGEXP_EXTRACT_ALL(text, r"(<div \w+>)") AS matches
      FROM regex.test
     ) t
WHERE ARRAY_LENGTH(matches) > 0

答案 1 :(得分:1)

查看codepen.io

与NULL比较的原因是REGEXP_EXTRACT_ALL的工作原因是因为 它返回数组,所以检查长度是这样的。与NULL比较仍然适用于REGEXP_EXTRACT

此外,理想情况下,您应该能够使用REGEX_MATCH来过滤掉没有匹配的记录,但看起来这个功能在标准模式下存在问题