2016-06-05 14 views
1

Ich kann nicht auf einen SELECT Alias ​​in BigQuery verweisen (Standardmodus).BigQuery Wählen Sie Alias ​​mit regex_extract_all im Standardmodus

Der Versuch, diese Abfrage zu tun:

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

Hier sind Schritte zu reproduzieren.

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>'] | 
+--------------+ 

Wenn ich versuche, die matches alias zu verweisen, sehe ich einen Fehler:

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 

Ich bin nicht in der Lage des Alias ​​matches, zu verweisen und bin nicht in der Lage, diese Ergebnisse WHERE matches IS NOT NULL zu filtern.

Weiß jemand, was ich hier falsch mache?

Danke!

Antwort

2

Auch in BQ können Sie in der where-Klausel keinen Spaltenalias verwenden. Nur eine Unterabfrage verwenden:

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

Dank! Das hat funktioniert. Ich habe gerade den Teil für 'ARRAY_LENGTH' hinzugefügt (https://cloud.google.com/bigquery/sql-reference/functions-and-operators#array_length) –

1

Check out SELECT list aliases visibility

Der Grund, warum mit NULL does't Arbeit für REGEXP_EXTRACT_ALL Vergleich ist, weil gibt es Array so mit der Länge Überprüfung der richtigen Weg ist. Im Vergleich mit NULL wird immer noch funktioniert für REGEXP_EXTRACT

Darüber hinaus idealerweise sollten Sie verwenden REGEX_MATCH seinen Datensätze herauszufiltern w/o Streichhölzer, aber sieht aus wie es ein Problem mit dieser Funktion im Standardmodus ist

+0

Danke! Ich habe festgestellt, dass 'REGEXP_CONTAINS' im Standard-SQL-Modus anstelle von' REGEX_MATCH' funktioniert. –

+0

Gut gefunden. Ich danke Ihnen für das Teilen! –

Verwandte Themen