Case sensitive REPLACE

Kolejne pytanie: jak wykonać REPLACE w SQL Serverze, ale tak żeby zamieniało będąc wrażliwym na wielkość znaków? Czyli coś w stylu:

REPLACE(kolumna, ‚mars’, ‚Snickers’) – źle
REPLACE(kolumna, ‚Mars’, ‚Snickers’) – dobrze

Funkcja REPLACE dokonuje porównania stringów na podstawie parametru COLLATION bazy danych lub kolumny. Aby zmienić to zachowanie najprościej lokalnie wykorzystać COLLATE.

Na początek jak sprawdzić ustawienie COLLATION dla bazy danych:

SELECT SERVERPROPERTY (‚Collation’)
lub
exec sp_helpsort

u mnie dało odpowiednio:
Polish_CI_AS
lub
Polish, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive

Oznacza to, że ustawiono sortowanie bez względu na wielkość znaków (CI), ale z wrażliwością na akcenty (AS). Aby rozróżniać wielkość znaków ustawiamy COLLATE w zapytaniu:

CREATE TABLE #t (
    k1 varchar(10)
)

INSERT INTO #t VALUES ('Mars')
INSERT INTO #t VALUES ('mars')
INSERT INTO #t VALUES ('maRs')
INSERT INTO #t VALUES ('MARS')

SELECT *
FROM #t
WHERE k1 = 'mars'

SELECT *
FROM #t
WHERE k1 COLLATE Polish_CS_AS = 'mars'

DROP TABLE #t

Pierwszy SELECT zwróci wszystkie cztery wiersze, ponieważ weźmie pod uwagę globalne ustawienie sortowania. W drugim już wymuszamy branie pod uwagę wielkości znaków (CS = Case Sensitive), stąd tylko jeden wiersz.

Zastosowanie COLLATE w REPLACE:

SELECT REPLACE(k1, 'Mars', 'Snickers')
FROM #t

SELECT REPLACE(k1 COLLATE Polish_CS_AS, 'Mars', 'Snickers')
FROM #t

Pierwszy przykład zamieni wszystkie wiersze, drugi tylko jeden.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s