2015-08-17 40 views
11

Tôi muốn thực hiện tác vụ nếu chuỗi đầu vào chứa bất kỳ ký tự có dấu nào khác thực hiện một tác vụ khác trong SQL. Có cách nào để kiểm tra điều kiện này trong SQL?Kiểm tra Nếu chuỗi có chứa các ký tự có dấu trong SQL?

Ví dụ:

@myString1 = 'àéêöhello!' 

IF(@myString1 contains any accented characters) 
    Task1 
ELSE 
    Task2 
+3

Tôi nghi ngờ có một số giải pháp thông qua từ khóa đối chiếu; nhưng chưa chắc nó là gì. Đăng bài như một bình luận trong trường hợp này truyền cảm hứng cho người khác ... 'collate SQL_Latin1_General_CP1_CI_AS' – JohnLBevan

+0

Bạn có thể chỉ cần tạo một hằng số hệ thống với tất cả các ký tự có dấu như một danh sách kiểm tra và sau đó kiểm tra thông qua một biểu thức chính quy? – Falco

+0

Năm máy chủ SQL nào? – Matt

Trả lời

8

SQL Fiddle: http://sqlfiddle.com/#!6/9eecb7d/1607

declare @a nvarchar(32) = 'àéêöhello!' 
declare @b nvarchar(32) = 'aeeohello!' 

select case 
    when (cast(@a as varchar(32)) collate SQL_Latin1_General_Cp1251_CS_AS) = @a 
    then 0 
    else 1 
end HasSpecialChars 

select case 
    when (cast(@b as varchar(32)) collate SQL_Latin1_General_Cp1251_CS_AS) = @b 
    then 0 
    else 1 
end HasSpecialChars 

(dựa trên giải pháp ở đây: How can I remove accents on a string?)

0

Một cách thô là để kiểm tra ASCII(<each character>) >= 128 cho mỗi nhân vật. Một cái gì đó như thế này

DECLARE @MyString NVARCHAR(100) 
SET @MyString = N'àéêöhello!' 

;WITH N as 
(
SELECT 1 r UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), Numbers 
as 
(
SELECT RN = ROW_NUMBER()OVER(ORDER BY N1.r) FROM N as N1 CROSS JOIN N as N2 
) 
SELECT MAX(CASE WHEN ASCII(SUBSTRING(@MyString,RN,1)) >= 128 THEN 1 ELSE 0 END) ContainsAccentedChars FROM Numbers 
WHERE RN <= LEN(@MyString) 
2

Tôi sử dụng chức năng này để nhận văn bản (chủ yếu là tên gia đình nước ngoài) để so sánh đồng bằng latin (với một số quà tặng khác - cảm thấy tự do thực hiện ...).

Có thể bạn cũng có thể sử dụng điều này. Chỉ cần so sánh, nếu chuỗi của bạn giống như chuỗi được truyền lại.

CREATE FUNCTION [dbo].[GetRunningNumbers](@anzahl INT=1000000, @StartAt INT=0) 
RETURNS TABLE 
AS 
RETURN 
    SELECT TOP (ISNULL(@anzahl,1000000)) ROW_NUMBER() OVER(ORDER BY A) -1 + ISNULL(@StartAt,0) AS Nmbr 
    FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblA(A) 
     ,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblB(B) 
     ,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblC(C) 
     ,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblD(D) 
     ,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblE(E) 
     ,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblF(F); 

GO 
CREATE FUNCTION [dbo].[GetTextPlainLatin] 
(
    @Txt VARCHAR(MAX) 
    ,@CaseSensitive BIT 
    ,@KeepNumbers BIT 
    ,@NonCharReplace VARCHAR(100),@MinusReplace VARCHAR(100) 
    ,@PercentReplace VARCHAR(100),@UnderscoreReplace VARCHAR(100) --for SQL-Masks 
    ,@AsteriskReplace VARCHAR(100),@QuestionmarkReplace VARCHAR(100) --for SQL-Masks (Access-Style) 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 

DECLARE @txtTransformed VARCHAR(MAX)=(SELECT LTRIM(RTRIM(CASE WHEN ISNULL(@CaseSensitive,0)=0 THEN LOWER(@Txt) ELSE @Txt END))); 
RETURN 
(
    SELECT Repl.ASCII_Code 
    FROM dbo.GetRunningNumbers(LEN(@txtTransformed),1) AS pos 
    --ASCII-Codes of all characters in your text 
    CROSS APPLY(SELECT ASCII(SUBSTRING(@txtTransformed,pos.Nmbr,1)) AS ASCII_Code) AS OneChar 
    --re-code 
    CROSS APPLY 
    (
     SELECT CASE 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('A') AND ASCII('Z') THEN CHAR(OneChar.ASCII_Code) 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('a') AND ASCII('z') THEN CHAR(OneChar.ASCII_Code) 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('0') AND ASCII('9') AND @KeepNumbers=1 THEN CHAR(OneChar.ASCII_Code) 
      WHEN OneChar.ASCII_Code = ASCII('ƒ') THEN 'f' 
      WHEN OneChar.ASCII_Code = ASCII('Š') THEN 'S' 
      WHEN OneChar.ASCII_Code = ASCII('š') THEN 's' 
      WHEN OneChar.ASCII_Code = ASCII('ß') THEN 'ss' 
      WHEN OneChar.ASCII_Code = ASCII('Ä') THEN 'Ae' 
      WHEN OneChar.ASCII_Code = ASCII('ä') THEN 'ae' 
      WHEN OneChar.ASCII_Code = ASCII('Æ') THEN 'Ae' 
      WHEN OneChar.ASCII_Code = ASCII('æ') THEN 'ae' 
      WHEN OneChar.ASCII_Code = ASCII('Ö') THEN 'Oe' 
      WHEN OneChar.ASCII_Code = ASCII('ö') THEN 'oe' 
      WHEN OneChar.ASCII_Code = ASCII('Œ') THEN 'Oe' 
      WHEN OneChar.ASCII_Code = ASCII('œ') THEN 'oe' 
      WHEN OneChar.ASCII_Code = ASCII('Ü') THEN 'Ue' 
      WHEN OneChar.ASCII_Code = ASCII('ü') THEN 'ue' 
      WHEN OneChar.ASCII_Code = ASCII('Ž') THEN 'Z' 
      WHEN OneChar.ASCII_Code = ASCII('ž') THEN 'z' 
      WHEN OneChar.ASCII_Code = ASCII('×') THEN 'x' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('À') AND ASCII('Å') THEN 'A' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('à') AND ASCII('å') THEN 'a' 
      WHEN OneChar.ASCII_Code = ASCII('Ç') THEN 'C' 
      WHEN OneChar.ASCII_Code = ASCII('ç') THEN 'c' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('È') AND ASCII('Ë') THEN 'E' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('è') AND ASCII('ë') THEN 'e' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('Ì') AND ASCII('Ï') THEN 'I' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('ì') AND ASCII('ï') THEN 'i' 
      WHEN OneChar.ASCII_Code = ASCII('Ð') THEN 'D' --island Eth 
      WHEN OneChar.ASCII_Code = ASCII('ð') THEN 'd' --island eth 
      WHEN OneChar.ASCII_Code = ASCII('Ñ') THEN 'N' 
      WHEN OneChar.ASCII_Code = ASCII('ñ') THEN 'n' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('Ò') AND ASCII('Ö') THEN 'O' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('ò') AND ASCII('ö') THEN 'o' 
      WHEN OneChar.ASCII_Code = ASCII('Ø') THEN 'O' 
      WHEN OneChar.ASCII_Code = ASCII('ø') THEN 'o' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('Ù') AND ASCII('Ü') THEN 'U' 
      WHEN OneChar.ASCII_Code BETWEEN ASCII('ù') AND ASCII('ü') THEN 'u' 
      WHEN OneChar.ASCII_Code = ASCII('Ý') THEN 'Y' 
      WHEN OneChar.ASCII_Code = ASCII('ý') THEN 'y' 
      WHEN OneChar.ASCII_Code = ASCII('Þ') THEN 'Th' --island Thorn 
      WHEN OneChar.ASCII_Code = ASCII('þ') THEN 'th' --island thorn 
      WHEN OneChar.ASCII_Code = ASCII('Ÿ') THEN 'Y' 
      WHEN OneChar.ASCII_Code = ASCII('ÿ') THEN 'y' 
      --Special with "minus" 
      WHEN OneChar.ASCII_Code = ASCII('-') THEN ISNULL(@MinusReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))) 
      --Special with mask characters 
      WHEN OneChar.ASCII_Code = ASCII('%') THEN ISNULL(@PercentReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))) 
      WHEN OneChar.ASCII_Code = ASCII('_') THEN ISNULL(@UnderscoreReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))) 
      WHEN OneChar.ASCII_Code = ASCII('*') THEN ISNULL(@AsteriskReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))) 
      WHEN OneChar.ASCII_Code = ASCII('?') THEN ISNULL(@QuestionmarkReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))) 
      --replace others   
      ELSE ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)) 
     END AS ASCII_Code 
    ) AS Repl  
    FOR XML PATH(''),TYPE 
).value('.','varchar(max)'); 
END 
GO 

SELECT dbo.GetTextPlainLatin('Case sensitive ÄÖ àéêöhello!',1,1,NULL,NULL,NULL,NULL,NULL,NULL); 
SELECT dbo.GetTextPlainLatin('Case in-sensitive ÄÖ àéêöhello!',0,1,NULL,NULL,NULL,NULL,NULL,NULL); 
GO 
DROP FUNCTION dbo.GetTextPlainLatin 
GO 
DROP FUNCTION dbo.GetRunningNumbers; 
+0

Hi downvoter! Tâm trí để giải thích? – Shnugo

Các vấn đề liên quan