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

5 sposobów na zwracanie wierszy zawierających małe litery w SQL Server

Jeśli chcesz znaleźć wiersze zawierające małe litery w SQL Server, możesz wypróbować jedną z następujących opcji.

Przykładowe dane

Załóżmy, że mamy tabelę z następującymi danymi:

SELECT c1 FROM t1;

Wynik:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

Możemy użyć następujących metod, aby zwrócić wiersze zawierające małe litery.

Opcja 1:Porównaj z UPPER() Ciąg

Możemy użyć UPPER() funkcja do porównania oryginalnej wartości z jej odpowiednikiem pisanym wielkimi literami:

SELECT * FROM t1
WHERE UPPER(c1) COLLATE Latin1_General_CS_AS <> c1;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Używając nie równego (<> ) operator (możesz alternatywnie użyć != zamiast <> jeśli wolisz), zwracamy tylko te wiersze, które różnią się od ich odpowiedników pisanych wielkimi literami. Powodem, dla którego to robimy, jest to, że jeśli wartość jest taka sama jak jej odpowiednik pisany wielkimi literami, to na początku była już pisana wielkimi literami (i nie chcemy jej zwracać).

Używamy również COLLATE Latin1_General_CS_AS aby jawnie określić sortowanie z uwzględnieniem wielkości liter (i akcentu). Bez tego możesz uzyskać nieoczekiwane wyniki, w zależności od sortowania używanego w twoim systemie.

Opcja 2:Porównaj z rzeczywistymi znakami

Alternatywnie możemy użyć LIKE operatora i określ rzeczywiste małe litery, które chcemy dopasować:

SELECT * FROM t1
WHERE c1 LIKE '%[abcdefghijklmnopqrstuvwxyz]%'
COLLATE Latin1_General_CS_AS;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

W takim przypadku zwracanych jest mniej wierszy niż w poprzednim przykładzie. Dzieje się tak, ponieważ nie określiłem znaków takich jak é i ø , które zostały zwrócone w poprzednim przykładzie. Chociaż jeden wiersz zawiera é , ten wiersz został zwrócony tylko dlatego, że zawiera również inne pasujące do siebie małe litery.

Dlatego ten przykład jest bardziej ograniczony niż poprzedni, ale zapewnia większą kontrolę nad znakami, które chcesz dopasować.

Opcja 3:Porównaj z zakresem znaków

Możemy alternatywnie określić zakres znaków, które chcemy dopasować:

SELECT * FROM t1
WHERE c1 LIKE '%[a-z]%'
COLLATE Latin1_General_100_BIN2;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

W tym przypadku użyłem zestawienia binarnego (Latin1_General_100_BIN2 ). Zrobiłem to, ponieważ układy binarne sortują każdy przypadek osobno (w ten sposób:AB....YZ...ab...yz ).

Inne porównania mają tendencję do przeplatania wielkich i małych liter (na przykład:AaBb...YyZz ), które w związku z tym pasują zarówno do wielkich, jak i małych liter.

Opcja 4:Znajdź pierwsze wystąpienie małej litery

Innym sposobem na to jest użycie PATINDEX() funkcja:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 0;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

W tym przykładzie określamy dokładnie te znaki, które chcemy dopasować, więc w tym przypadku nie otrzymaliśmy wierszy z znakami, takimi jak é i ø (inny niż ten, który zawiera również inne dopasowane znaki).

Jedną z zalet tej techniki jest to, że możemy jej użyć do zignorowania pierwszego znaku (lub określonej liczby znaków), jeśli sobie tego życzymy:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 1;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Dlatego możemy zwrócić wszystkie wiersze, które zawierają małe litery, ale pierwszy znak nie jest małymi literami.

Dzieje się tak, ponieważ PATINDEX() zwraca pozycję początkową pierwszego wystąpienia wzorca (w naszym przypadku wzorzec jest listą małych liter). Jeśli pozycja początkowa pierwszego wystąpienia jest większa niż 1, to pierwszego znaku nie ma na naszej liście małych liter.

Chociaż ta technika może być wykorzystana do zignorowania pierwszego znaku będącego wielką literą, nie wyklucza to, że pierwszy znak może być innym znakiem, na przykład liczbą. Widzimy to w drugim wierszu, który zawiera 1café .

Opcja 5:Znajdź pierwszą instancję na podstawie zakresu

Możemy również użyć PATINDEX() z zakresem:

SELECT * FROM t1
WHERE PATINDEX('%[a-z]%', c1
COLLATE Latin1_General_100_BIN2) > 1;

Wynik:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Ponownie użyłem zestawienia binarnego (jak w innym przykładzie zakresu).


  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 dodać grupę plików do bazy danych programu SQL Server (T-SQL)

  2. Jaki jest cel używania OPTION(MAXDOP 1) w SQL Server?

  3. Czekam na localhost, na zawsze!

  4. Nie można połączyć się z hostem lokalnym, ale można z nazwą komputera w SQL Server 2008

  5. Jaka jest różnica między varchar a nvarchar?