Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
MJ - 25-11-2006 00:06
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Witam.
Walczę z następującym problemem:
Jest sobie baza zawierająca prefixy telefoniczne w postaci template1=# select * from ct; id | prefix | price ----+--------+------- 3 | 012 | 0.5 4 | 0124 | 0.1 (2 rows)
template1=#
Jak zadać zapytanie mając pełen numer (np 012476486) aby dostać najbardziej precyzyjne dopasowanie w tabeli ( w tym wypadku 0124) ?
Nie jestem guru w PostgreSQL i jakoś nic mi nie wychodzi ...
Pozdrawiam grupowiczów.
MJ - 25-11-2006 00:06
MJ napisał(a): > Witam. > > Walczę z następującym problemem: > > Jest sobie baza zawierająca prefixy telefoniczne w postaci > template1=# select * from ct; > id | prefix | price > ----+--------+------- > 3 | 012 | 0.5 > 4 | 0124 | 0.1 > (2 rows) > > template1=# > > Jak zadać zapytanie mając pełen numer (np 012476486) aby dostać > najbardziej precyzyjne dopasowanie w tabeli ( w tym wypadku 0124) ? > > Nie jestem guru w PostgreSQL i jakoś nic mi nie wychodzi ... > > Pozdrawiam grupowiczów.
Poradziłem sobie :): template1=# select * from ct where '01248764' like prefix || '%' order by length(prefix) desc limit 1; id | prefix | price ----+--------+------- 4 | 0124 | 0.1 (1 row)
template1=#
hubert depesz lubaczewski - 25-11-2006 00:07
MJ wrote: > Jest sobie baza zawierająca prefixy telefoniczne w postaci > template1=# select * from ct; > id | prefix | price > ----+--------+------- > 3 | 012 | 0.5 > 4 | 0124 | 0.1 > (2 rows) > template1=# > Jak zadać zapytanie mając pełen numer (np 012476486) aby dostać > najbardziej precyzyjne dopasowanie w tabeli ( w tym wypadku 0124) ? > Nie jestem guru w PostgreSQL i jakoś nic mi nie wychodzi ...
założyłeś tabele w template1? heh. no to się teraz zdziwisz jak założysz nową bazę.
a to co chcesz jest proste: select * from ct where '012476486' like prefix || '%' order by length(prefix) desc limit 1;
depesz
-- mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam coś do powiedzenia. (c) 1998 depesz
Łukasz Kalbarczyk - 25-11-2006 00:07
Dnia Fri, 24 Nov 2006 09:13:06 +0100, hubert depesz lubaczewski napisał(a):
> a to co chcesz jest proste: > select * from ct where '012476486' like prefix || '%' order by > length(prefix) desc limit 1;
Mam wrażenie, że to będzie nieskończenie wolne.
-- ŁK http://moze.sprawdz.sobie.to
hubert depesz lubaczewski - 26-11-2006 00:15
Łukasz Kalbarczyk wrote:
> Dnia Fri, 24 Nov 2006 09:13:06 +0100, hubert depesz lubaczewski > napisał(a): > >> a to co chcesz jest proste: >> select * from ct where '012476486' like prefix || '%' order by >> length(prefix) desc limit 1; > > Mam wrażenie, że to będzie nieskończenie wolne.
masz rację: masz wrażenie.
depesz
-- mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam coś do powiedzenia. (c) 1998 depesz
Marcin Jurczuk - 26-11-2006 00:15
Łukasz Kalbarczyk napisał(a): > Dnia Fri, 24 Nov 2006 09:13:06 +0100, hubert depesz lubaczewski napisał(a): > >> a to co chcesz jest proste: >> select * from ct where '012476486' like prefix || '%' order by >> length(prefix) desc limit 1; > > Mam wrażenie, że to będzie nieskończenie wolne. > Wstępne testy pokazują, że jest wystarczająco szybkie, żeby nie powiedzieć porównywalne z normalnym select..
Michal Jankowski - 26-11-2006 00:15
Marcin Jurczuk <mj-usunto@tkb.pl> writes:
>>> select * from ct where '012476486' like prefix || '%' order by >>> length(prefix) desc limit 1; >> Mam wrażenie, że to będzie nieskończenie wolne. >> > Wstępne testy pokazują, że jest wystarczająco szybkie, żeby nie > powiedzieć porównywalne z normalnym select..
A bez "limit 1" to zwraca miliard rekordów czy trzy?
8-)
MJ
Marcin Jurczuk - 26-11-2006 00:15
Michal Jankowski napisał(a): > Marcin Jurczuk <mj-usunto@tkb.pl> writes: > >>>> select * from ct where '012476486' like prefix || '%' order by >>>> length(prefix) desc limit 1; >>> Mam wrażenie, że to będzie nieskończenie wolne. >>> >> Wstępne testy pokazują, że jest wystarczająco szybkie, żeby nie >> powiedzieć porównywalne z normalnym select.. > > A bez "limit 1" to zwraca miliard rekordów czy trzy? > > 8-) > > MJ zwraca wszystkie które pasują czyli jeśli mam w bazie: 012 0124 01246 a zadam pytanie o prefix 012469857 to zwraca wszystkie trzy.
Michal Jankowski - 26-11-2006 00:15
Marcin Jurczuk <mj-usunto@tkb.pl> writes:
>>>> Mam wrażenie, że to będzie nieskończenie wolne. >>>> >>> Wstępne testy pokazują, że jest wystarczająco szybkie, żeby nie >>> powiedzieć porównywalne z normalnym select.. >> A bez "limit 1" to zwraca miliard rekordów czy trzy?
> a zadam pytanie o prefix 012469857 to zwraca wszystkie trzy.
Toteż właśnie - sortowanie trzech elementów raczej nie trwa długo 8-).
MJ
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plshutter.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|