MSSQL wyszukwianie imienia i nazwiska

0

Witam potrzebuję pomocy przy mssql.
Potrzebuję wyszukiwarki po imieniu i nazwisku.
Tabela składa się z ID, imie i nazwiska.

Szukam np.

tak: select * from Table1 where NAZWISKO LIKE '%kow%';

Ale potrzebuję, żeby szukać po imieniu i nazwisku i tak doszedłem do polecenia:

select * from Table1 where 'Michał' in (imie, nazwisko,imie+' '+nazwisko, nazwisko + ' ' + imie);

To mi wyszukuje po imie, nazwisku lub imieniu i nazwisku.
Jak wprowadzić do tego zapytania LIKE tak aby szukało mi również nazwisk imion zawierajacych jakąś frazę np. "kow" bo teraz jak nie ma takeigo nazwiska to nic nie wyszukuje a chciałbym aby zwracało kowalski.

0

Ja wiem że "polska język trudna bardzo", ale mógłbyś trochę wysiłku włożyć w poprawne napisanie posta.

Potrzebuję wyszukiwarki po imieniu i nazwisku.

Zwykłe AND nie wystarczy?

0

Dziękuje za zwrócenie uwagi na język.
Miałem to zrobione na OR'ach, ale szukam jak najlepiej zoptymalizować zapytanie gdybym jeszcze chciał szukać w trzeciej kolumnie np. drugie imię.
Przedstawiony kod przeze mnie działa tylko jak w niego wrzucić jeszcze LIKE, celem wyszukiwania o części nazwiska.

0

where imie||nazwisko like '%mich%' tylko tu nie ma mowy o jakiejkolwiek optymalizacji bo wyszukiwanie like '%tekst%' nie używa indeksu

0

Tak "bajdełejem":

SELECT * FROM Table1 WHERE 'Michał' IN (imie, nazwisko,imie+' '+nazwisko, nazwisko + ' ' + imie);

Wątpię, by takie zapytanie przeszło. Mnie uczono, że WHERE ... IN używa się nieco inaczej.

0
Serechiel napisał(a):

Tak "bajdełejem":

SELECT * FROM Table1 WHERE 'Michał' IN (imie, nazwisko,imie+' '+nazwisko, nazwisko + ' ' + imie);

Wątpię, by takie zapytanie przeszło. Mnie uczono, że WHERE ... IN używa się nieco inaczej.

Przechodzi i działa dla: Jan, Kowalski, Jan Kowalski, Kowalski Jan i to jest ok tylko like bym chciał jakoś ładnie w to dodać.

abrakadaber napisał(a):

where imie||nazwisko like '%mich%' tylko tu nie ma mowy o jakiejkolwiek optymalizacji bo wyszukiwanie like '%tekst%' nie używa indeksu

Nie działa chyba, że nie rozumiem

select * from Table1 where imie || nazwisko like '%mich%';

0

Nie działa chyba, że nie rozumiem

SELECT * FROM Table1 WHERE imie || nazwisko LIKE '%mich%';

Ale chyba nie zadajesz bazie takiego pytania? "Lub" pisze i używa się nieco inaczej.

0
Serechiel napisał(a):

Nie działa chyba, że nie rozumiem

SELECT * FROM Table1 WHERE imie || nazwisko LIKE '%mich%';

Ale chyba nie zadajesz bazie takiego pytania? "Lub" pisze i używa się nieco inaczej.

Oczywiście, że nie zadaje. Taki pseudo kod.
Żeby nie było:

SELECT * Table1 WHERE imie LIKE '%mich%' or nazwisko LIKE '%mich%';

A nie napisałem też precyzyjnie co nie działa.
Chodzi, że jak to jeszcze rozbić w przypadku gdy ktoś wpisze "Jan Kowalski" to go znajdzie.

0

A nie napisałem też precyzyjnie co nie działa.
Chodzi, że jak to jeszcze rozbić w przypadku gdy ktoś wpisze "Jan Kowalski" to go znajdzie.

Chwila, bo nie wiem czy dobrze łapię. Chcesz by klient został poproszony o podanie imienia lub nazwiska, wpisał obie wartości w jedno pole, a baza mu wypluła żądana wartość? Nie jestem pewien czy podaną wyżej metodą (like) jest to wykonalne, albowiem nie mogę nijakiego wzorca stąd dopasować.

SELECT * FROM Table1 WHERE 'Michał' IN (imie, nazwisko,imie+' '+nazwisko, nazwisko + ' ' + imie);

To mi wyszukuje po imie, nazwisku lub imieniu i nazwisku.
Jak wprowadzić do tego zapytania LIKE tak aby szukało mi również nazwisk imion zawierajacych jakąś frazę np. "kow" bo teraz jak nie ma takeigo nazwiska to nic nie wyszukuje a chciałbym aby zwracało kowalski.

https://stackoverflow.com/questions/1865353/combining-like-and-in-for-sql-server
https://stackoverflow.com/questions/3014940/is-there-a-combination-of-like-and-in-in-sql

Do podanego zapytania like wprowadzić się nie da. Albo where in, albo like.

0

Może jednak fulltext search?

0

A może tak:

WHERE imie + 'xxx' + nazwisko like '%michał%'

zamisat 'xxx' wstaw sobie znak, który na pewno nie wystapi w masce (enter, tab, albo cos poniżej chr(32))

0
Marcin.Miga napisał(a):

A może tak:

WHERE imie + 'xxx' + nazwisko like '%michał%'

zamisat 'xxx' wstaw sobie znak, który na pewno nie wystapi w masce (enter, tab, albo cos poniżej chr(32))

Dziękuje to jest dobra opcja.

select * from Table1 where IMIE + ' ' + NAZWISKO like '%szukana%' OR NAZWISKO + ' ' + IMIE like '%szukana%';
1

To nie jest dobra opcja. Sam LIKE jest bardzo nie wydajny, a w połączeniu z OR to już tragedia.... Tego OR-a możesz zastąpić czymś takim:

SELECT * FROM Table1 WHERE IMIE + ' ' + NAZWISKO + ' ' + IMIE LIKE '%szukana%';
0

Sam LIKE jest bardzo nie wydajny, a w połączeniu z OR to już tragedia....

Tragedia? Pobierze wszystkie rekordy z bazy 1 raz i przetworzy je przez regular expression 4 razy. Szacuję, że będzie 1.05 raza wolniejsze od twojego rozwiązania. Mylę się?

0

Jak wprowadzić do tego zapytania LIKE tak aby szukało mi również nazwisk imion zawierajacych jakąś frazę np. "kow" bo teraz jak nie ma takeigo nazwiska to nic nie wyszukuje a chciałbym aby zwracało kowalski.

Widzę obecnie w programach, że oczekuje się od użytkownika nieco więcej sprytu i daje mu się też większą precyzję wyszukiwania. Opisujesz pole wyszukiwania, że wyszukuje imię nazwisko z możliwością użycia procentu jako dowolnego znaku. Wtedy już ty nie dodajesz tego procentu, tylko użytkownik sam decyduje, czy go chce czy nie. Jak wrzucił procent, robisz like na imie+nazwisko, jak nie dał procentu - wyszukujesz efektywnie twoim (dla mnie też nowość) warunkiem IN.

Edit: Jeżeli nie chcemy przelatywać całej bazy danych przy każdym wyszukiwaniu na procencie, musimy użyć full-text search.

Furthermore, a LIKE query against a large amount of unstructured text data is much slower than an equivalent full-text query against the same data. A LIKE query against millions of rows of text data can take minutes to return; whereas a full-text query can take only seconds or less against the same data, depending on the number of rows that are returned.

Full-text search ma pewne ograniczenia w stosunku do LIKE. Nie zadziała suffix ani infix search, np. *ski, *arci*. Obsługuje tylko wyszukiwanie całych słów albo po prefiksie (Mar*). Ale w praktyce więcej nie trzeba.

0

A może wystarczy

CONCAT(imie,nazwisko) like '%kow%'

0

abrakadabre uważasz że to jest to samo? każde z nich działa inaczej, a które jest bardziej optymalne?

1 użytkowników online, w tym zalogowanych: 0, gości: 1