Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

CHARINDEX() vs PATINDEX() w SQL Server — jaka jest różnica?

W SQL Server możesz użyć CHARINDEX() funkcji lub PATINDEX() funkcja, aby znaleźć ciąg w ciągu. Są to funkcje tekstowe Transact-SQL, które są również dostępne w bazach danych Azure.

Na pozór te funkcje wydają się robić dokładnie to samo, aw wielu przypadkach możesz użyć tego, co wolisz.

Istnieje jednak kilka różnic, które mogą dyktować, którą funkcję zdecydujesz się użyć w określonych scenariuszach. Można je podsumować w następujący sposób:

  • PATINDEX() umożliwia używanie symboli wieloznacznych do wyszukiwania wzorców. CHARINDEX() nie.
  • CHARINDEX() akceptuje trzeci argument, który pozwala określić pozycję początkową wyszukiwania. PATINDEX() nie.

Więcej szczegółów na temat tych punktów poniżej.

Definicja

Najpierw spójrzmy na oficjalną definicję lub każdą funkcję.

CHARINDEX()
Wyszukuje jednoznakowe wyrażenie wewnątrz drugiego wyrażenia znakowego, zwracając początkową pozycję pierwszego wyrażenia, jeśli zostało znalezione.
PATINDEX()
Zwraca pozycję początkową pierwszego wystąpienia wzorca w określonym wyrażeniu lub zera, jeśli wzorzec nie został znaleziony, we wszystkich prawidłowych typach danych tekstowych i znakowych.

Składnia

A oto oficjalna składnia każdej funkcji.

CHARINDEX()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX()

PATINDEX ( '%pattern%' , expression )

Tak więc obie funkcje umożliwiają wyszukiwanie wyrażenia znakowego, jednak PATINDEX() funkcja umożliwia wyszukiwanie wzoru . Jest to więc dodatkowa funkcjonalność, której nie dostaniesz dzięki CHARINDEX() funkcjonować. Z PATINDEX() możesz użyć symboli wieloznacznych, aby określić wzorzec do przeszukania, co może być bardzo przydatne w niektórych sytuacjach.

Jednak CHARINDEX() akceptuje trzy argumenty, podczas gdy PATINDEX() akceptuje tylko dwa. CHARINDEX() funkcja przyjmuje opcjonalny trzeci argument, który pozwala określić pozycję początkową wyszukiwania. Innymi słowy, CHARINDEX() funkcja pozwala zwrócić tylko te dopasowania, które występują po określonym punkcie w ciągu.

Przykłady

Oto przykłady demonstrujące dodatkową funkcjonalność zapewnianą przez każdą funkcję.

CHARINDEX()

Tutaj podaję trzeci argument określający pozycję do rozpoczęcia wyszukiwania. W takim przypadku pominie pierwsze wystąpienie Bob i zwróci pozycję drugiego wystąpienia.

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Wynik:

17

Jak wspomniano, nie możesz tego zrobić za pomocą PATINDEX() ponieważ nie akceptuje trzeciego parametru.

PATINDEX()

Oto przykład czegoś, co możesz zrobić za pomocą PATINDEX() czego nie możesz zrobić za pomocą CHARINDEX() . W tym przykładzie używamy symboli wieloznacznych do wyszukiwania wzorca:

SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Wynik:

11

W tym przypadku używamy znaków procentu (% ), które są symbolami wieloznacznymi wskazującymi, że dowolna liczba znaków może być kontynuowana i powieść ciąg wyszukiwania. Używamy również podkreślenia (_ ), który jest symbolem wieloznacznym dla każdego singla znak.

Wniosek

Tak więc, gdy obie metody CHARINDEX() i PATINDEX() zapewniają podobną funkcjonalność, a w wielu przypadkach można użyć jednego zamiast drugiego, czasami trzeba użyć jednego z drugim.

W szczególności użyjesz CHARINDEX() gdy chcesz określić pozycję początkową w ciągu do przeszukania. I użyjesz PATINDEX() kiedy musisz określić wzór do wyszukania.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć konto pocztowe bazy danych z profilu w programie SQL Server (T-SQL)

  2. Eksplorowanie interfejsu graficznego magazynu zapytań SQL Server 2016

  3. Jak wyeksportować dane SQL Server z tabeli do pliku CSV

  4. Przetwarzaj JSON w TSQL

  5. SQL Server:kolumny indeksu używane w podobnym?