微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

第1排:துயஇம்மானுவேல்தேவாலயம்,北街,Idyanvillai,泰米尔纳德邦,印度

第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行谢谢.

解决方法

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产品.)

原文地址:https://www.jb51.cc/mssql/83413.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐