niedziela, 31 października 2010

collation

Czasami polskie znaki (ą,ę,ć…) przysparzają sporo problemów, znalezienie np. loginu na podstawie nazwiska jest sporym wyzwaniem.
Stworzenie do tego celu wyszukiwania pełnotekstowego mija się z celem.
Możemy zrobić .NET (CLR) lub funkcję używającą REPLACE.
Ja proponuję sztuczkę z wykorzystaniem COALESCE

Tworzymy tabelkę

USE tempdb
go
CREATE TABLE #coalesce  (txt VARCHAR (20))
go
INSERT #coalesce
        SELECT 'jazn zolta ges cma'
UNION SELECT 'jaźń żółtą gęś ćma'
go

Sprawdzamy jakie mamy kodowanie

SELECT name,collation_name
FROM sys.all_columns
WHERE object_id = object_id('#coalesce')

name      collation_name
----------------------------
txt       Polish_CI_AS


Szukamy w tekście

SELECT txt FROM #coalesce
WHERE txt LIKE 'jazn zolta ges cma'

txt
--------------------
jazn zolta ges cma

(1 row(s) affected)

Możemy poszukać tak, ale to mało elastyczne rozwiązanie

SELECT txt FROM #coalesce
WHERE txt LIKE 'ja[zź][nń] [zż][oó][lł]t[aą] g[eę][sś] [cć]ma'

txt
--------------------
jazn zolta ges cma
jaźń żółtą gęś ćma

(2 row(s) affected)

Możemy zmienić kodowanie wyszukiwanego teksu

SELECT txt FROM #coalesce
WHERE txt  LIKE 'jazn zolta ges cma' COLLATE cyrillic_general_ci_as

txt
--------------------
jazn zolta ges cma
jaźń żółtą gęś ćma

(2 row(s) affected)

Wybór strony kodowania na cyrillic_general_ci_as jedną z wielu możliwości.

CREATE TABLE #test(name varchar(200), description varchar(MAX))
go
INSERT #test
SELECT *
FROM fn_helpcollations()

CREATE TABLE #wynik (kodowanie varchar(200))

DECLARE @name varchar(200)
DECLARE @sql varchar(max)
SET @sql ='SELECT txt FROM #coalesce
WHERE txt  LIKE ''jazn zolta ges cma'' COLLATE '

declare cursorek cursor for
SELECT name FROM #test
OPEN cursorek
FETCH NEXT FROM cursorek INTO
@name
WHILE @@fetch_status =0
BEGIN
EXEC (@sql+@name)
IF @@ROWCOUNT=2
INSERT #wynik SELECT @name

FETCH NEXT FROM cursorek INTO
@name
END
CLOSE cursorek
DEALLOCATE cursorek

SELECT COUNT(*) FROM #wynik

-----------
291

Brak komentarzy:

Prześlij komentarz