2016-04-15 2 views
0

So ist dies nicht das beste Beispiel, aber im Wesentlichen gibt es ein Feld in der Tabelle, die ich abfrage, die eine URL ist und Abfrageeingaben enthält wie auch, ich möchte nur URLs auswählen, die etwas nach query=Wie Regex in Postgres-Abfrage zu allen Text nach einem Treffer zu finden

so würde ich Reihen erhalten möchten 1 und 2.

Es wäre noch viel cooler, wenn ich auch das, was nach der folgen könnte erfassen könnte? (hello, postgres)

Vielen Dank für irgendwelche Einsichten oder helfen

Antwort

0

Sie können leicht die Zeilen mit auswählen:

where url like '%query=_%' 

Sie bekommen, was auf verschiedene Weise nach kommt. Hier ist eine einfache Möglichkeit:

select (case when url like '%query=_%' 
      then substr(url, position('query=' in url) + 6) 
     end) as querystring 
from pageviews; 
+0

Entschuldigung - ich versuche, dies auszuführen (Ich habe von angefügt) und es sagt, dass es nicht finden kann Tabelle mit dem Namen "URL"? Weißt du, warum das so sein könnte? Auch 'like '% query =%' gibt immer noch die Zeilen mit nichts nach, wie z. B. Zeile 4 in meinem Beispiel. – loonyuni

+0

'where URL wie '% query = _%'' nach _ "wähle URLs, die etwas nach' query = '" _ – Abelisto

+0

@loonyuni haben. . . "URL" ist ein Spaltenname. Ich weiß nicht, wie der Tabellenname lautet. –

0

Hier wird mehr Index freundliche Lösung:

drop table if exists foo.t; 
create table foo.t (x bigserial, url varchar); 
insert into foo.t(url) values 
    ('facebook.com/user?query=hello'), 
    ('stackoverflow.com/question/?query1=postgres'), 
    ('facebook.com/videos?'), 
    ('facebook.com/user?query='); 
insert into foo.t(url) select url from foo.t, generate_series(1,100000); 
create index iturl on foo.t(position('?query=' in url), length(url)); 
explain analyze select * from foo.t where position('?query=' in url) > 0 and length(url) > position('?query=' in url) + 7; 

und das Ergebnis ist:

              QUERY PLAN               
----------------------------------------------------------------------------------------------------------------------------- 
Bitmap Heap Scan on t (cost=3736.79..12211.16 rows=67005 width=37) (actual time=62.072..407.323 rows=100001 loops=1) 
    Recheck Cond: ("position"((url)::text, '?query='::text) > 0) 
    Filter: (length((url)::text) > ("position"((url)::text, '?query='::text) + 7)) 
    Rows Removed by Filter: 100001 
    Heap Blocks: exact=3449 
    -> Bitmap Index Scan on iturl (cost=0.00..3720.04 rows=201015 width=0) (actual time=60.473..60.473 rows=200002 loops=1) 
     Index Cond: ("position"((url)::text, '?query='::text) > 0) 
Planning time: 0.512 ms 
Execution time: 423.587 ms 
(9 rows) 

Beachten Sie, dass ich Ihre Ausgangsdaten geändert Index wählbar machen (1/4 Treffer).