如何在sql server 2005中选择包含非英文字符的行(它应该只过滤非英文字符,而不是特殊字符)

时间:2014-01-15 13:52:07

标签: sql-server

因为我的表包含非英语(包含不同语言的字符)字符和列中的特殊字符。我只需要过滤非英文字符。它应该过滤任何特殊字符。

我尝试使用不同的方法进行过滤,但未能过滤几行。有人请帮帮我。提前谢谢。

例如: 列名 LOCATION 包含以下行:

第1行:துயஇம்மானுவேல்தேவாலயம்,North Street,Idyanvillai,Tamil Nadu,India

第2行:Dr.Hakim M.Asgar Ali的ROY MEDICAL CENTER™Unani诊所位于印度喀拉拉邦,Thycaud Hospital Road,Opp。 Amritha Hotel ,, Thycaud.P.O。,, Thiruvananthapuram,印度喀拉拉邦

第3行:ಕಾಳಿಕಾಂಬದೇವಿ ದೇವಸ್ಥಾನ,Shivaji Nagar,Davangere,印度卡纳塔克邦

由于上面包含许多语言的字符。任何人都可以帮我选择第2行谢谢。

4 个答案:

答案 0 :(得分:9)

T-SQL的字符串处理功能非常简陋。

如果通过使用Unicode UTF-16区分“非英语”字段,您可以尝试类似

的内容
SELECT * FROM MyTable WHERE MyField = Cast(MyField AS VARCHAR)

仅提取UTF-8中可表达的行。

我知道如何测试字段是否来自任意字符集的唯一方法是使用user-defined function,如下所示:

CREATE FUNCTION IsAllowed (@input VARCHAR(MAX)) RETURNS BIT
-- Returns 1 if string is allowed, 0 otherwise.
-- Usages: SELECT dbo.IsAllowed('Hello'); -- returns 1
--         SELECT dbo.IsAllowed('Hello, world!'); -- returns 0
-- Note CHARINDEX is not case sensitive so @allowables doesn't need both.
--      VARCHAR(MAX) is different under SQL Server 2005 than 2008+
---     and use of defined VARCHAR size might be necessary.
AS
BEGIN
  DECLARE @allowables char(26) = 'abcdefghijklmnopqrstuvwxyz';
  DECLARE @allowed int = 0; 
  DECLARE @index int = 1;
  WHILE @index <= LEN(@input)
    BEGIN
    IF CHARINDEX(SUBSTRING(@input,@index,1),@allowables)=0
      BEGIN
      SET @allowed = 0;
      BREAK;
      END
    ELSE
      BEGIN
      SET @allowed = 1;
      SET @index = @index+1;
      END
    END
  RETURN @allowed
END

用户定义的函数可以应用于SELECT中的列,如下所示:

SELECT * FROM MyTable WHERE dbo.IsAllowed(MyField) = 1

请注意,架构名称(在这种情况下为dbo)对于用户定义的函数不是可选的。

如果T-SQL用户定义的函数不合适,您还可以使用CLR Function。然后,您可以将regexp或其他任何内容应用于列。由于它们会破坏可移植性并带来安全风险,因此许多系统管理员不允许使用CLR功能。 (这包括Microsoft的SQL Azure产品。)

答案 1 :(得分:3)

如果您拥有所有允许的特殊字符,则以下select语句应选择仅包含英语和允许的特殊字符的所有列:

./docker-copyedit.py FROM image1 INTO image2 REMOVE ALL VOLUMES

您可以在方括号内添加所有允许的特殊字符。

答案 2 :(得分:2)

我的问题得到了很好的答案。

     select ID, LATITUDE, LONGITUDE, REFERENCE, LOCATION, VALIDATE,
     patindex('%[^ !-~()"]%' COLLATE Latin1_General_BIN,LOCATION) as [Position],
     substring(LOCATION,patindex('%[^ !-~()"]%' COLLATE Latin1_General_BIN,LOCATION),1) as [InvalidCharacter],
     ascii(substring(LOCATION,patindex('%[^ !-~()"]%' COLLATE Latin1_General_BIN,LOCATION),1)) as [ASCIICode]from  dbo.RADAR_SEARCH where patindex('%[^ !-~()"]%' COLLATE Latin1_General_BIN,LOCATION) >0

EDIT1: 上述答案的解释

  

以上查询仅过滤位置列中的非英语字符,其中不包含特殊字符。

注意:仅在MS-SQL中测试。

答案 3 :(得分:0)

我用它来将具有非英文字符的电子邮件转换为 NULL。 (MS SQL)

CREATE FUNCTION ufn_character_test(@kontrol nvarchar(MAX))
RETURNS int
AS
BEGIN
DECLARE @intFlag INT
SET @intFlag = 1
DECLARE @intFlag2 INT
SET @intFlag2 = 1
DECLARE @SonucFlag INT
SET @SonucFlag=0
DECLARE @SonucFlag2 INT
SET @SonucFlag2=0
WHILE (@intFlag <=LEN(@kontrol))
BEGIN
WHILE (@intFlag2 <=62)
BEGIN
IF CAST(SUBSTRING(@kontrol, @intFlag, 1) as varbinary(2))
=CAST(SUBSTRING('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', @intFlag2, 1) as varbinary(2))
SET @SonucFlag=@SonucFlag+1
SET @intFlag2 = @intFlag2 + 1
END
SET @intFlag = @intFlag + 1
SET @intFlag2 = 1
END
IF @SonucFlag=LEN(@kontrol)
SET @SonucFlag2=1
ELSE
SET @SonucFlag2=0
RETURN @SonucFlag2
END


USE master;
GRANT EXEC ON dbo.ufn_character_test TO PUBLIC


SELECT ADR_EMAIL,
CASE WHEN ADR_EMAIL NOT LIKE '%[%]%'
AND ADR_EMAIL NOT LIKE '%@%@%%'
AND ADR_EMAIL NOT LIKE '.%'
AND ADR_EMAIL NOT LIKE '%.'      
AND dbo.ufn_character_test(REPLACE(REPLACE(REPLACE(REPLACE(ADR_EMAIL,'.',''),'@',''),'_',''),'-',''))=1
AND ADR_EMAIL LIKE '__%@%__.__%'
THEN ADR_EMAIL ELSE NULL END AS EMAIL
FROM EMAILTABLE