我无法在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
。
有谁知道我在这里做错了什么?
谢谢!
答案 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)
与NULL比较的原因是REGEXP_EXTRACT_ALL
的工作原因是因为
它返回数组,所以检查长度是这样的。与NULL比较仍然适用于REGEXP_EXTRACT
此外,理想情况下,您应该能够使用REGEX_MATCH来过滤掉没有匹配的记录,但看起来这个功能在标准模式下存在问题