SQL
PODOBNY operator
Szukaj…
Składnia
Symbol wieloznaczny z%: SELECT * FROM [table] WHERE [nazwa_kolumny] Jak „% Value%”
Symbol wieloznaczny z _: WYBIERZ * Z [tabeli] GDZIE [nazwa_kolumny] Jak „V_n%”
Symbol wieloznaczny z [charlist]: SELECT * FROM [table] WHERE [nazwa_kolumny] Jak „V [abc] n%”
Uwagi
Warunek LIKE w klauzuli WHERE służy do wyszukiwania wartości kolumn pasujących do podanego wzorca. Wzory są tworzone przy użyciu dwóch następujących symboli wieloznacznych
- % (Symbol procentu) - Używany do reprezentowania zera lub więcej znaków
- _ (Podkreślenie) - Używany do reprezentowania pojedynczego znaku
Dopasuj wzór otwarty
%
Symbol wieloznaczny dołączony na początku lub na końcu (lub obu) ciągu pozwoli na dopasowanie 0 lub więcej dowolnych znaków przed początkiem lub po końcu wzorca.
Użycie „%” na środku pozwoli dopasować 0 lub więcej znaków między dwiema częściami wzoru.
Wykorzystamy tę tabelę pracowników:
ID | FName | LName | Numer telefonu | ManagerId | DepartmentId | Wynagrodzenie | Data wynajmu |
---|---|---|---|---|---|---|---|
1 | Jan | Johnson | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
2) | Zofia | Amudsen | 2479100211 | 1 | 1 | 400 | 11-01-2010 |
3) | Ronny | Kowal | 2462544026 | 2) | 1 | 600 | 06-08-2015 |
4 | Jon | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
5 | Hilde | Sęk | 2468021911 | 2) | 1 | 800 | 01-01-2000 |
Następująca instrukcja pasuje do wszystkich rekordów zawierających FName zawierających ciąg „on” z tabeli pracowników.
SELECT * FROM Employees WHERE FName LIKE '%on%';
ID | FName | LName | Numer telefonu | ManagerId | DepartmentId | Wynagrodzenie | Data wynajmu |
---|---|---|---|---|---|---|---|
3) | R na ny | Kowal | 2462544026 | 2) | 1 | 600 | 06-08-2015 |
4 | J on | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
Poniższa instrukcja pasuje do wszystkich rekordów o numerze telefonu rozpoczynającym się od ciągu „246” od pracowników.
SELECT * FROM Employees WHERE PhoneNumber LIKE '246%';
ID | FName | LName | Numer telefonu | ManagerId | DepartmentId | Wynagrodzenie | Data wynajmu |
---|---|---|---|---|---|---|---|
1 | Jan | Johnson | 246 8101214 | 1 | 1 | 400 | 23-03-2005 |
3) | Ronny | Kowal | 246 2544026 | 2) | 1 | 600 | 06-08-2015 |
5 | Hilde | Sęk | 246 8021911 | 2) | 1 | 800 | 01-01-2000 |
Poniższa instrukcja pasuje do wszystkich rekordów o numerze telefonu kończącym się ciągiem „11” od pracowników.
SELECT * FROM Employees WHERE PhoneNumber LIKE '%11'
ID | FName | LName | Numer telefonu | ManagerId | DepartmentId | Wynagrodzenie | Data wynajmu |
---|---|---|---|---|---|---|---|
2) | Zofia | Amudsen | 24791002 11 | 1 | 1 | 400 | 11-01-2010 |
5 | Hilde | Sęk | 24680219 11 | 2) | 1 | 800 | 01-01-2000 |
Wszystkie rekordy, w których trzeci znak Fname to „n” od pracowników.
SELECT * FROM Employees WHERE FName LIKE '__n%';
(dwa znaki podkreślenia są używane przed „n”, aby pominąć pierwsze 2 znaki)
ID | FName | LName | Numer telefonu | ManagerId | DepartmentId | Wynagrodzenie | Data wynajmu |
---|---|---|---|---|---|---|---|
3) | Ronny | Kowal | 2462544026 | 2) | 1 | 600 | 06-08-2015 |
4 | Jon | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
Dopasowanie jednego znaku
Aby poszerzyć wybór instrukcji języka strukturalnego zapytania (SQL-SELECT), można użyć symboli wieloznacznych, znaku procentu (%) i znaku podkreślenia (_).
Znak _
(podkreślenie) może być użyty jako symbol wieloznaczny dla dowolnego pojedynczego znaku w dopasowaniu wzorca.
Znajdź wszystkich pracowników, których Fname zaczyna się na „j”, a kończy na „n” i ma dokładnie 3 znaki w Fname.
SELECT * FROM Employees WHERE FName LIKE 'j_n'
Znak _
(podkreślenie) może być również użyty więcej niż jeden raz jako symbol wieloznaczny w celu dopasowania wzorców.
Na przykład ten wzór pasuje do „jon”, „jan”, „jen” itp.
Nazwy te nie będą wyświetlane „jn”, „jan”, „jordan”, „justin”, „jason”, „julian”, „jillian”, „joann”, ponieważ w naszym zapytaniu używany jest jeden znak podkreślenia i można go pominąć jeden znak, więc wynik musi składać się z 3 znaków Fname.
Na przykład ten wzorzec pasowałby do „LaSt”, „LoSt”, „HaLt” itp.
SELECT * FROM Employees WHERE FName LIKE '_A_T'
Dopasuj według zakresu lub zestawu
Dopasuj dowolny pojedynczy znak z określonego zakresu (np .: [af]
) lub ustaw (np .: [abcdef]
).
Ten wzorzec zasięgu pasowałby do „gary”, ale nie do „mary”:
SELECT * FROM Employees WHERE FName LIKE '[a-g]ary'
Ten wzorzec pasowałby do „mary”, ale nie do „gary”:
SELECT * FROM Employees WHERE Fname LIKE '[lmnop]ary'
Zasięg lub zestaw można również zanegować, dodając ^
daszek przed zakresem lub zestawem:
Ten wzorzec zasięgu nie pasuje do „gary”, ale pasuje do „mary”:
SELECT * FROM Employees WHERE FName LIKE '[^a-g]ary'
Ten wzorzec nie pasuje do „mary”, ale pasuje do „gary”:
SELECT * FROM Employees WHERE Fname LIKE '[^lmnop]ary'
Dopasuj DOWOLNE do WSZYSTKICH
Dopasuj dowolny:
Musi pasować co najmniej jeden ciąg. W tym przykładzie typem produktu musi być „elektronika”, „książki” lub „wideo”.
SELECT *
FROM purchase_table
WHERE product_type LIKE ANY ('electronics', 'books', 'video');
Dopasuj wszystko (musi spełniać wszystkie wymagania).
W tym przykładzie muszą być dopasowane zarówno „zjednoczone królestwo”, jak i „londyn” i „droga wschodnia” (w tym warianty).
SELECT *
FROM customer_table
WHERE full_address LIKE ALL ('%united kingdom%', '%london%', '%eastern road%');
Wybór negatywny:
Użyj WSZYSTKIE, aby wykluczyć wszystkie elementy.
Ten przykład daje wszystkie wyniki, w których typem produktu nie jest „elektronika”, a nie „książki”, a nie „wideo”.
SELECT *
FROM customer_table
WHERE product_type NOT LIKE ALL ('electronics', 'books', 'video');
Wyszukaj zakres znaków
Poniższa instrukcja pasuje do wszystkich rekordów o nazwie FName, które zaczynają się na literę od A do F z tabeli pracowników .
SELECT * FROM Employees WHERE FName LIKE '[A-F]%'
Instrukcja ESCAPE w zapytaniu LIKE
Jeśli zaimplementujesz wyszukiwanie tekstu jako zapytanie typu LIKE
, zwykle robisz to w następujący sposób:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%')
Jednak (poza tym, że nie powinieneś koniecznie używać LIKE
gdy możesz korzystać z wyszukiwania pełnotekstowego), to stwarza problem, gdy ktoś wprowadza tekst taki jak „50%” lub „a_b”.
Tak więc (zamiast przejścia na wyszukiwanie pełnotekstowe) możesz rozwiązać ten problem za pomocą instrukcji LIKE
-escape:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'
Oznacza to, że \
będzie teraz traktowane jako znak ESCAPE. Oznacza to, że możesz teraz po prostu wstawić \
do każdego znaku w wyszukiwanym ciągu, a wyniki zaczną być poprawne, nawet gdy użytkownik wprowadzi znak specjalny, taki jak %
lub _
.
na przykład
string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch)
newString += @"\" + c;
sqlCmd.Parameters.Add("@in_SearchText", newString);
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);
Uwaga: powyższy algorytm służy wyłącznie do celów demonstracyjnych. Nie zadziała w przypadkach, gdy 1 grafem składa się z kilku znaków (utf-8). np. string stringToSearch = "Les Mise\u0301rables";
Musisz to zrobić dla każdego grafemu, a nie dla każdej postaci. Nie powinieneś używać powyższego algorytmu, jeśli masz do czynienia z językami azjatyckimi / wschodnioazjatyckimi / południowoazjatyckimi. A raczej, jeśli chcesz, aby kod zaczynał się poprawnie, powinieneś to zrobić dla każdego klastra graphemeCluster.
Zobacz także ReverseString, wywiad w języku C #
Znaki wieloznaczne
symbole wieloznaczne są używane z operatorem LIKE SQL. Symbole wieloznaczne SQL służą do wyszukiwania danych w tabeli.
Symbole wieloznaczne w SQL to:%, _, [charlist], [^ charlist]
% - Zastępuje zero lub więcej znaków
Eg: //selects all customers with a City starting with "Lo"
SELECT * FROM Customers
WHERE City LIKE 'Lo%';
//selects all customers with a City containing the pattern "es"
SELECT * FROM Customers
WHERE City LIKE '%es%';
_ - Zastępuje pojedynczy znak
Eg://selects all customers with a City starting with any character, followed by "erlin"
SELECT * FROM Customers
WHERE City LIKE '_erlin';
[lista] - Zestawy i zakresy znaków do dopasowania
Eg://selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[adl]%';
//selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[a-c]%';
[^ charlist] - Pasuje tylko do znaku NIEokreślonego w nawiasach
Eg://selects all customers with a City starting with a character that is not "a", "p", or "l"
SELECT * FROM Customers
WHERE City LIKE '[^apl]%';
or
SELECT * FROM Customers
WHERE City NOT LIKE '[apl]%' and city like '_%';