Lists: | pgsql-de-allgemein |
---|
From: | Andreas Tille <andreas(at)an3as(dot)eu> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Selection ganzer Worte per regexp Suche |
Date: | 2013-07-11 15:07:08 |
Message-ID: | 20130711150708.GL28723@an3as.eu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hallo,
ich möchte aus folgender Tabelle
CREATE table test (
row int,
data text
) ;
INSERT INTO test VALUES ( 1, 'abc' );
INSERT INTO test VALUES ( 2, 'abc, xyz' );
INSERT INTO test VALUES ( 3, 'uvw, abc, xyz' );
INSERT INTO test VALUES ( 4, 'xabc' );
INSERT INTO test VALUES ( 5, 'yabcz' );
alls die Zeilen heraussuchen, in denen das ganze Wort 'abc' vorkommt
aber eben nicht sowas wie 'xabc'. Mit anderen Worten, die Abfrage
soll nur die Zeilen 1, 2 und 3 enthalten, das heißt
SELECT * FROM test WHERE data like '%abc%' ;
liefert zu viel. Ich habe also mit regexp experimentiert und dachte
sowas wie
SELECT * FROM test WHERE data ~ '\babc\b' ;
wäre eine gute Idee - das liefert aber keine Zeile. Selbst
SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
Wie kann man die betreffenden Zeilen geschickt herausfiltern?
Bemerkung: In meiner Anwendung werden die Worte immer durch ', '
getrennt, wenn es mehrere sein sollten. Eventuell kann man die also in
ein Array aufsplitten und dann im Array nach ganzen Wörtern suchen.
Da ich denke, daß sowas länger dauert, würde ich die regexp Methode
bevorzugen.
Viele Grüße
Andreas.
From: | Lars Grundei <l(dot)grundei(at)meteocontrol(dot)de> |
---|---|
To: | "pgsql-de-allgemein(at)postgresql(dot)org" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Selection ganzer Worte per regexp Suche |
Date: | 2013-07-11 15:14:47 |
Message-ID: | 0EAF4A34C2A33B4FB958F0A6150072AC4B3DD8C1DA@mcsrv03.meteocontrol.intra |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
> -----Ursprüngliche Nachricht-----
> Von: pgsql-de-allgemein-owner(at)postgresql(dot)org [mailto:pgsql-de-allgemein-
> owner(at)postgresql(dot)org] Im Auftrag von Andreas Tille
> Gesendet: Donnerstag, 11. Juli 2013 17:07
> An: pgsql-de-allgemein(at)postgresql(dot)org
> Betreff: [pgsql-de-allgemein] Selection ganzer Worte per regexp Suche
>
> Hallo,
>
> ich möchte aus folgender Tabelle
>
> CREATE table test (
> row int,
> data text
> ) ;
>
> INSERT INTO test VALUES ( 1, 'abc' );
> INSERT INTO test VALUES ( 2, 'abc, xyz' ); INSERT INTO test VALUES ( 3,
'uvw,
> abc, xyz' ); INSERT INTO test VALUES ( 4, 'xabc' ); INSERT INTO test
VALUES (
> 5, 'yabcz' );
>
> alls die Zeilen heraussuchen, in denen das ganze Wort 'abc' vorkommt aber
eben
> nicht sowas wie 'xabc'. Mit anderen Worten, die Abfrage soll nur die
Zeilen
> 1, 2 und 3 enthalten, das heißt
>
> SELECT * FROM test WHERE data like '%abc%' ;
>
> liefert zu viel. Ich habe also mit regexp experimentiert und dachte sowas
wie
>
> SELECT * FROM test WHERE data ~ '\babc\b' ;
>
> wäre eine gute Idee - das liefert aber keine Zeile. Selbst
>
> SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
>
> liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
> Wie kann man die betreffenden Zeilen geschickt herausfiltern?
>
> Bemerkung: In meiner Anwendung werden die Worte immer durch ', '
> getrennt, wenn es mehrere sein sollten. Eventuell kann man die also in
ein
> Array aufsplitten und dann im Array nach ganzen Wörtern suchen.
> Da ich denke, daß sowas länger dauert, würde ich die regexp Methode
> bevorzugen.
>
Ohne es jetzt genau probiert zu haben, aber diese Regex sollte genau das tun
'((\s|,)abc(\s+|,|$)|^abc$)'.
From: | Boris Skegin <boris(dot)skegin(dot)de(at)googlemail(dot)com> |
---|---|
To: | Andreas Tille <andreas(at)an3as(dot)eu> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Selection ganzer Worte per regexp Suche |
Date: | 2013-07-11 15:16:47 |
Message-ID: | CAB2jy+01jDAh4Dr5cmonazv2abnp4zacERrSC6CuATH+Lsj5DA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
wie wäre' mit :
SELECT * FROM test WHERE data in ('abc,' ,' abc,',' abc') ;
Am 11.07.13 schrieb Andreas Tille <andreas(at)an3as(dot)eu>:
> Hallo,
>
> ich möchte aus folgender Tabelle
>
> CREATE table test (
> row int,
> data text
> ) ;
>
> INSERT INTO test VALUES ( 1, 'abc' );
> INSERT INTO test VALUES ( 2, 'abc, xyz' );
> INSERT INTO test VALUES ( 3, 'uvw, abc, xyz' );
> INSERT INTO test VALUES ( 4, 'xabc' );
> INSERT INTO test VALUES ( 5, 'yabcz' );
>
> alls die Zeilen heraussuchen, in denen das ganze Wort 'abc' vorkommt
> aber eben nicht sowas wie 'xabc'. Mit anderen Worten, die Abfrage
> soll nur die Zeilen 1, 2 und 3 enthalten, das heißt
>
> SELECT * FROM test WHERE data like '%abc%' ;
>
> liefert zu viel. Ich habe also mit regexp experimentiert und dachte
> sowas wie
>
> SELECT * FROM test WHERE data ~ '\babc\b' ;
>
> wäre eine gute Idee - das liefert aber keine Zeile. Selbst
>
> SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
>
> liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
> Wie kann man die betreffenden Zeilen geschickt herausfiltern?
>
> Bemerkung: In meiner Anwendung werden die Worte immer durch ', '
> getrennt, wenn es mehrere sein sollten. Eventuell kann man die also in
> ein Array aufsplitten und dann im Array nach ganzen Wörtern suchen.
> Da ich denke, daß sowas länger dauert, würde ich die regexp Methode
> bevorzugen.
>
> Viele Grüße
>
> Andreas.
>
> --
> http://fam-tille.de
>
>
> --
> Sent via pgsql-de-allgemein mailing list
> (pgsql-de-allgemein(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-de-allgemein
>
From: | Peter Eisentraut <peter_e(at)gmx(dot)net> |
---|---|
To: | Andreas Tille <andreas(at)an3as(dot)eu> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Selection ganzer Worte per regexp Suche |
Date: | 2013-07-11 17:39:08 |
Message-ID: | 51DEEDBC.2020404@gmx.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
On 7/11/13 11:07 AM, Andreas Tille wrote:
> SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
>
> liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
Aus mir unerklärlichen Gründen heißt das hier \y:
SELECT * FROM test WHERE data ~ '\yabc\y';
From: | Andreas Tille <andreas(at)an3as(dot)eu> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Selection ganzer Worte per regexp Suche |
Date: | 2013-07-16 08:40:14 |
Message-ID: | 20130716084014.GB934@an3as.eu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hallo Peter,
On Thu, Jul 11, 2013 at 01:39:08PM -0400, Peter Eisentraut wrote:
> On 7/11/13 11:07 AM, Andreas Tille wrote:
> > SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
> >
> > liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
>
> Aus mir unerklärlichen Gründen heißt das hier \y:
>
> SELECT * FROM test WHERE data ~ '\yabc\y';
Das würde ich eher als Bug denn als Feature bezeichnen - schon auf Grund
der Tatsache, daß man die Information kaum irgendwo finden kann.
Viele Grüße
Andreas.
From: | Stefan Kaltenbrunner <stefan(at)kaltenbrunner(dot)cc> |
---|---|
To: | Andreas Tille <andreas(at)an3as(dot)eu> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Selection ganzer Worte per regexp Suche |
Date: | 2013-08-07 06:38:02 |
Message-ID: | 5201EB4A.3050108@kaltenbrunner.cc |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
On 07/16/2013 10:40 AM, Andreas Tille wrote:
> Hallo Peter,
>
> On Thu, Jul 11, 2013 at 01:39:08PM -0400, Peter Eisentraut wrote:
>> On 7/11/13 11:07 AM, Andreas Tille wrote:
>>> SELECT * FROM test WHERE data ~ '.*\babc\b.*' ;
>>>
>>> liefert nichts - scheinbar ist '\b' (Wortgrenze) nicht implementiert.
>>
>> Aus mir unerklärlichen Gründen heißt das hier \y:
>>
>> SELECT * FROM test WHERE data ~ '\yabc\y';
>
> Das würde ich eher als Bug denn als Feature bezeichnen - schon auf Grund
> der Tatsache, daß man die Information kaum irgendwo finden kann.
postgresql verwendet die regex engine von henry spencer in TCL:
Stefan