Zapytanie z like wykorzystujące pole z bazy danych

W przypadku realizacji prostego wyszukiwania zwłaszcza tam gdzie wydajność nie jest aż tak ważna można skorzystać z klauzuli like czy też ilike, która ignoruje wielkośc liter (PostgreSQL). Można również ten mechanizm wykorzystać aby sprawdzić nazwijmy to podejrzenia konfliktów jakiś zasobów – rodzi się pytanie jak sobie poradzić kiedy chcielibyśmy np. sprawdzić czy dane pole zawiera w sobie tekst z jakiegokolwiek innego rekordu tej samej tabeli.

W przypadku wyszukiwania z góry określonego tekstu napiszemy zapytanie typu :

SELECT* FROM artykuly WHERE tytul ilike '%rambo%'

dzięki czemu pobierzemy z tabeli artykuly rekordy, w których pole tytul zawiera słowo „rambo” – nic zaskakującego.

Teraz chcemy sprawdzić teoretyczne duplikaty czyli takie wpisy, które w tytule zawierają słowa takie same jak w jakimkolwiek innym wpisie – wszystko super tylko jak użyć pola, a nie zwykłego stringa w zapytaniu ?

Możemy próbować np. tak :

SELECT artykuly1.*, artykuly2.id FROM artykuly artykuly1 
INNER JOIN artykuly artykuly2 ON 
(
artykuly2.tytul ilike '%'artykuly1.tytul'%' AND artykuly2.id!=artykuly1.id
)

SELECT artykuly1.*, artykuly2.id FROM artykuly artykuly1 
INNER JOIN artykuly artykuly2 ON 
(
artykuly2.tytul ilike '%'.artykuly1.tytul.'%' AND artykuly2.id!=artykuly1.id
)

SELECT artykuly1.*, artykuly2.id FROM artykuly artykuly1 
INNER JOIN artykuly artykuly2 ON 
(
artykuly2.tytul ilike '%'+artykuly1.tytul+'%' AND artykuly2.id!=artykuly1.id
)

Czyli były to takie nasze próby „wplecenia” wartości z kolumny do warunków – niestety były to próby nieudolne.

Jak więc to zrobić ? Bardzo prosto – trzeba skorzystać z „pionowych kresek” i w ten sposób mamy zapytanie :

SELECT artykuly1.*, artykuly2.id FROM artykuly artykuly1 
INNER JOIN artykuly artykuly2 ON 
(
artykuly2.tytul ilike '%' || artykuly1.tytul || '%'  AND artykuly2.id!=artykuly1.id
)

I po sprawie :-)

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


+ osiem = 16

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>