由于我的表包含非英语(包含不同语言的字符)字符和列中的特殊字符.我只需要过滤非英文字符.它应该过滤任何特殊字符.
我尝试使用不同的方法进行过滤,但未能过滤几行.有人请帮帮我.提前致谢.
例如:列名称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.PO ,, Thiruvananthapuram,喀拉拉邦,印度
第3行:ಕಾಳಿಕಾಂಬದೇವಿ ದೇವಸ್ಥಾನ,Shivaji Nagar,Davangere,印度卡纳塔克邦
由于上面包含许多语言的字符.任何人都可以帮我选择第2行谢谢.
T-SQL的字符串处理能力非常简陋.
如果通过使用Unicode UTF-16来区分"非英语"字段,您可以尝试类似的方法
SELECT * FROM MyTable WHERE MyField = Cast(MyField AS VARCHAR)
Run Code Online (Sandbox Code Playgroud)
仅拉出UTF-8中可表达的行.
我知道如何测试字段是否来自任意字符集的唯一方法是使用用户定义的函数,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
用户定义的函数可以应用于SELECT中的列,如下所示:
SELECT * FROM MyTable WHERE dbo.IsAllowed(MyField) = 1
Run Code Online (Sandbox Code Playgroud)
请注意,架构名称(dbo在本例中)对于用户定义的函数不是可选的.
如果T-SQL用户定义的函数不合适,您还可以使用CLR函数.然后,您可以将regexp或其他任何内容应用于列.由于它们会破坏可移植性并带来安全风险,因此许多系统管理员不允许使用CLR功能.(这包括Microsoft的SQL Azure产品.)
如果您拥有所有允许的特殊字符,则以下 select 语句应选择仅包含英语和允许的特殊字符的所有列:
select column_name from table_name where column_name like '%[^a-z, .-™]%';
Run Code Online (Sandbox Code Playgroud)
您可以在方括号内添加所有允许的特殊字符。
| 归档时间: |
|
| 查看次数: |
21051 次 |
| 最近记录: |