prerobený like operátor

15 views
Skip to first unread message

Michal Páleník

unread,
Jan 20, 2022, 3:29:34 AM1/20/22
to postgr...@googlegroups.com
trochu ma hnevá like/ilike operator, keď rýchlo hľadám v tabuľke.

potreboval by som operator podobný ako ILIKE ale aby aj:
1. fungoval aj na text[], kľudne aby implicitne urobil
`tags::text ilike '%aaa%'` (zväčša hľadám iba jednu položku v array)

2. v text aby vyhodil diakritiku (z oboch strán)


nemáte niekto niečo hotové? resp nedáte to študentovi ako seminárku?

lebo mňa to hnevá iba trochu a občas, nie natoľko aby som
doprogramoval...

michal

--
Michal Páleník
www.oma.sk

Pavel Stehule

unread,
Jan 20, 2022, 3:56:09 AM1/20/22
to PostgreSQL-cz


čt 20. 1. 2022 v 9:29 odesílatel Michal Páleník <michal....@freemap.sk> napsal:
trochu ma hnevá like/ilike operator, keď rýchlo hľadám v tabuľke.

potreboval by som operator podobný ako ILIKE ale aby aj:
1. fungoval aj na text[], kľudne aby implicitne urobil
`tags::text ilike '%aaa%'` (zväčša hľadám iba jednu položku v array)

to by se asi dalo doprogramovat custom funkci - jen se musi asi spravne pojmenovat, a pak like by mohl zafungovat, pokud clovek nepotrebuje indexy, tak to nemusi byt v Ccku

 

2. v text aby vyhodil diakritiku (z oboch strán)




nemáte niekto niečo hotové? resp nedáte to študentovi ako seminárku?

lebo mňa to hnevá iba trochu a občas, nie natoľko aby som
doprogramoval...

:-)
 

michal

--
Michal Páleník
www.oma.sk

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/YekdYI9DXpo9Uo5u%40tanicka.iz.sk.

Pavel Stehule

unread,
Jan 20, 2022, 3:57:31 AM1/20/22
to PostgreSQL-cz


čt 20. 1. 2022 v 9:55 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:


čt 20. 1. 2022 v 9:29 odesílatel Michal Páleník <michal....@freemap.sk> napsal:
trochu ma hnevá like/ilike operator, keď rýchlo hľadám v tabuľke.

potreboval by som operator podobný ako ILIKE ale aby aj:
1. fungoval aj na text[], kľudne aby implicitne urobil
`tags::text ilike '%aaa%'` (zväčša hľadám iba jednu položku v array)

to by se asi dalo doprogramovat custom funkci - jen se musi asi spravne pojmenovat, a pak like by mohl zafungovat, pokud clovek nepotrebuje indexy, tak to nemusi byt v Ccku

Jan Michálek

unread,
Jan 20, 2022, 5:00:11 AM1/20/22
to postgr...@googlegroups.com
Tadz bzch osobně zvážil funkcionální index nad výrazem, resp cust fcí s unnest.

čt 20. 1. 2022 v 9:57 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:


--
Jelen
Starší čeledín datovýho chlíva

Michal Bartak

unread,
Jan 20, 2022, 12:08:55 PM1/20/22
to postgr...@googlegroups.com
Ahoj
Ja bych zvazil normalizaci :)

MB

čt 20. 1. 2022 v 11:00 odesílatel Jan Michálek <godzil...@gmail.com> napsal:

Michal Páleník

unread,
Jan 20, 2022, 2:35:54 PM1/20/22
to postgr...@googlegroups.com
dátová štruktúra je vcelku ok, len vždy zabudnem ktoré stĺpce sú array
a ktoré text (a na array nejde like) a že ktoré sú unaccentované. po pár
klikoch si spomeniem, ale to si stihnem zanadávať :)

m
> >> <https://groups.google.com/d/msgid/postgresql-cz/CAFj8pRA%2BghRzzEmTujuQ3wqj2MXjSHauUJ1ndWBER3t9%2BkC%2BNQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> >> .
> >>
> >
> >
> > --
> > Jelen
> > Starší čeledín datovýho chlíva
> >
> > --
> > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> > „PostgreSQL-cz“ ve Skupinách Google.
> > Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny,
> > zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> > Chcete-li tuto diskusi zobrazit na webu, navštivte
> > https://groups.google.com/d/msgid/postgresql-cz/CAAYBy8YPX0W%2BryMA%2BryVr1FBUB-d4j4Y36%2Bmphzs9VbFTUc8JA%40mail.gmail.com
> > <https://groups.google.com/d/msgid/postgresql-cz/CAAYBy8YPX0W%2BryMA%2BryVr1FBUB-d4j4Y36%2Bmphzs9VbFTUc8JA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> > .
> >
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAAVzF_ERnFH1T%3DWXokshG-8jJntA5ykzQZQ1zq70w-FiQ3ic_w%40mail.gmail.com.

--
Michal Páleník
www.oma.sk

Michal Bartak

unread,
Jan 20, 2022, 2:43:34 PM1/20/22
to postgr...@googlegroups.com


> 20. 1. 2022 v 20:35, Michal Páleník <michal....@freemap.sk>:
>
> ale to si stihnem zanadávať :)

Co dokazuje ze datova struktura neni „vcelku ok” ;)

MB

Pavel Stehule

unread,
Jan 20, 2022, 2:55:40 PM1/20/22
to PostgreSQL-cz


čt 20. 1. 2022 v 20:43 odesílatel Michal Bartak <maxym...@gmail.com> napsal:


> 20. 1. 2022 v 20:35, Michal Páleník <michal....@freemap.sk>:
>
> ale to si stihnem zanadávať :)

Co dokazuje ze datova struktura neni „vcelku ok” ;)

postgres=# create or replace function like_array_func(text[], text) returns bool as $$select exists(select v from unnest($1) v(v) where v like $2) $$ language sql;
CREATE FUNCTION
postgres=# create operator ~~ (function = like_array_func, leftarg = text[], rightarg = text);
CREATE OPERATOR
postgres=# select array['AHOJ','NAZDAR','BAZAR']::text[] like '%AH%';
┌──────────┐
│ ?column? │
╞══════════╡
│ t        │
└──────────┘
(1 row)

postgres=# select array['AHOJ','NAZDAR','BAZAR'] like '%AH%';
┌──────────┐
│ ?column? │
╞══════════╡
│ t        │
└──────────┘
(1 row)


kupodivu to funguje, coz jsem ani necekal



MB


--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.

Michal Páleník

unread,
Jan 21, 2022, 4:32:09 AM1/21/22
to postgr...@googlegroups.com
On Thu, Jan 20, 2022 at 08:55:01PM +0100, Pavel Stehule wrote:
> čt 20. 1. 2022 v 20:43 odesílatel Michal Bartak <maxym...@gmail.com>
> napsal:
>
> >
> >
> > > 20. 1. 2022 v 20:35, Michal Páleník <michal....@freemap.sk>:
> > >
> > > ale to si stihnem zanadávať :)
> >
> > Co dokazuje ze datova struktura neni „vcelku ok” ;)
> >
>
> postgres=# create or replace function like_array_func(text[], text) returns
> bool as $$select exists(select v from unnest($1) v(v) where v like $2) $$
> language sql;
> CREATE FUNCTION
> postgres=# create operator ~~ (function = like_array_func, leftarg =
> text[], rightarg = text);
> CREATE OPERATOR
> postgres=# select array['AHOJ','NAZDAR','BAZAR']::text[] like '%AH%';
> ┌──────────┐
> │ ?column? │
> ╞══════════╡
> │ t │
> └──────────┘
> (1 row)
>
> postgres=# select array['AHOJ','NAZDAR','BAZAR'] like '%AH%';
> ┌──────────┐
> │ ?column? │
> ╞══════════╡
> │ t │
> └──────────┘
> (1 row)
>
> kupodivu to funguje, coz jsem ani necekal
>

super, funguje krásne

trošku som opravil na (aby bolo aj ilike):
parallel safe a immutable je OK?

create or replace function like_array_func(text[], text) returns bool as $$
select exists(select v from unnest($1) v(v) where v like $2) $$
language sql IMMUTABLE PARALLEL SAFE;

create operator ~~ (function = like_array_func, leftarg = text[], rightarg = text);

create or replace function ilike_array_func(text[], text) returns bool as $$
select exists(select v from unnest($1) v(v) where v ilike $2) $$
language sql IMMUTABLE PARALLEL SAFE;

create operator ~~* (function = like_array_func, leftarg = text[], rightarg = text);


>
>
>
> > MB
> >
> > --
> > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> > PostgreSQL-cz ve Skupinách Google.
> > Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny,
> > zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> > Chcete-li zobrazit tuto diskusi na webu, navštivte
> > https://groups.google.com/d/msgid/postgresql-cz/DAFA22BF-2CFA-4D12-B941-99EFAD6A2FE5%40gmail.com
> > .
> >
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAFj8pRDAUh%3DkvCb5xB-_-d58rx-Y9tdz7pOCO8tBYh2_2KxP%2Bg%40mail.gmail.com.

--
Michal Páleník
www.oma.sk

Michal Páleník

unread,
Jan 21, 2022, 4:47:45 AM1/21/22
to postgr...@googlegroups.com
sorry, tu má byť function = ilike_array_func (i navyše)


>
>
> >
> >
> >
> > > MB
> > >
> > > --
> > > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> > > PostgreSQL-cz ve Skupinách Google.
> > > Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny,
> > > zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> > > Chcete-li zobrazit tuto diskusi na webu, navštivte
> > > https://groups.google.com/d/msgid/postgresql-cz/DAFA22BF-2CFA-4D12-B941-99EFAD6A2FE5%40gmail.com
> > > .
> > >
> >
> > --
> > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> > Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> > Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAFj8pRDAUh%3DkvCb5xB-_-d58rx-Y9tdz7pOCO8tBYh2_2KxP%2Bg%40mail.gmail.com.
>
> --
> Michal Páleník
> www.oma.sk
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
> Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/Yep9ja89w331WhJm%40tanicka.iz.sk.

--
Michal Páleník
www.oma.sk

Pavel Stehule

unread,
Jan 21, 2022, 4:48:33 AM1/21/22
to PostgreSQL-cz


pá 21. 1. 2022 v 10:32 odesílatel Michal Páleník <michal....@freemap.sk> napsal:
je to SQL funkce, ktera by se mela inlinovat - tudiz by se tam tyto flagy nemusely nastavovat. V tomhle mam gulas (bavime se o funkcich v SQL nikoliv v PL/pgSQL). Vzdy jsem si musel kontrolovat jak to funguje, protoze jsem mel pocit, ze nekdy ty flagy jsou potreba pro nejakou optimalizaci a jindy naopak blokuji inlining a pak je to dost pomale (funkce v SQL bez inliiningu jsou pomalejsi nez PL/pgSQL). Nicmene, co si vybavuju, tak zalezi na kontextu - jestli je to tabulkova funkce nebo ne. A dost mozna ze i zalezi na verzi. Tyhle veci resim jednou za X let, takze clovek zapomina. U PLpgSQL tyto problemy nejsou, protoze neresite inlining.
 
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/Yep9ja89w331WhJm%40tanicka.iz.sk.

Pavel Stehule

unread,
Jan 21, 2022, 4:55:03 AM1/21/22
to PostgreSQL-cz


pá 21. 1. 2022 v 10:47 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:
Tohle neni tabulkova funkce, ale obsahuje plny poddotaz (s klauzuli FROM), takze ohledne inliningu je to jeste neco jineho.

Asi by to bylo na hezkou bakalarku nebo diplomku napsat operator vcetne podpory indexu, a optimalizatoru. Je to ale opravdu prace na 1-2 mesice.

Ale ja nemam zadny studenty.

Jan Michálek

unread,
Jan 21, 2022, 5:00:22 AM1/21/22
to postgr...@googlegroups.com
No, hodně záleží na aplikaci. Jak se k těm datům přistupuje. Osobně mi přijde použití nerelačních datových typů docela praktický. Jasně model pak neni formálně správnej podle normálních forem, na druhou stranu je přehlednější a s použitím funkcionálních indexů to nemusí být nutně na úkor rychlosti. Zrovna u toho tagování hodně záleží na tom, kolik tagů (a jak variabilní počet to je) odpovídá jednomu tagovanému záznamu. U hodně velké tabulky, kde by byla vazební tabulka na tagy ještě pětkrát taková by se s tím už nepracovalo dobře. Např při importu osm se dělá z tagů hstore (tam je tag:hodnota) a přijde mi, že se s tím pracuje docela dobře. To bych se osobně spíš vystříhal použití toho like a snažil se mít ty tagy "pevný". Např jako pole enumů.
Je;

čt 20. 1. 2022 v 18:08 odesílatel Michal Bartak <maxym...@gmail.com> napsal:
Reply all
Reply to author
Forward
0 new messages