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.

Advertisements

Skomentuj

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

Logo WordPress.com

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

Zdjęcie z Twittera

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

Facebook photo

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

Google+ photo

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

Connecting to %s