【问题标题】:How to select records that contain non-English characters on SQL Server?如何在 SQL Server 上选择包含非英文字符的记录?
【发布时间】:2019-12-16 07:46:17
【问题描述】:

如何在 SQL Server 上选择包含非英文字符的记录?

数据列可以包含以下组合:

  • 英文字符
  • 特殊字符
  • 非英文字符

过滤器应该找到在其他字符中至少包含一个非英文字符的记录。

如果记录只包含英文和/或特殊字符,则不匹配过滤器。

数据示例:

  1. 我喜欢 كيكة التفاح بالمقلاة
  2. τράπεζα τους φόρους και τον ΕΝΦΙΑ
  3. 我喜欢தமிழ்
  4. “谢谢”@stackoverflow。
  5. https://stackoverflow.com

过滤器必须获取前 3 条记录。

【问题讨论】:

  • 什么算作“非英语”,例如,在母语英语(éü)单词中看不到重音字符。 æß 怎么样?

标签: sql-server


【解决方案1】:

您需要有一个英文字符的白名单,然后使用 UNICODE() 函数循环字符串的字符以确定字符串是否包含不在白名单中的字符,我更喜欢为此验证创建一个 UDF。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo.fn_Contains_Non_English_Char (
    @str_to_Validate NVARCHAR(MAX))
RETURNS BIT
AS
BEGIN
    DECLARE @index INT
    DECLARE @len INT
    DECLARE @char NCHAR(1)

    SET @index = 1
    SET @len = LEN(@str_to_Validate)

    WHILE @index <= @len
    BEGIN
        SET @char = SUBSTRING(@str_to_Validate, @index, 1)
        SET @index = @index + 1

        -- You can use your own whitelist here
        IF UNICODE(@char) > 127 -- ASC II Chars
        --IF UNICODE(@char) > 255 -- Extended ASC II Chars
            RETURN 1

    END

    RETURN 0
END
GO

WITH CTE AS (
    SELECT N'I liked كيكة التفاح بالمقلاة' AS NOTE UNION ALL
    SELECT N'τράπεζα τους φόρους και τον ΕΝΦΙΑ' AS NOTE UNION ALL
    SELECT N'I like தமிழ்' AS NOTE UNION ALL
    SELECT N'"Thank you" @stackoverflow.' AS NOTE UNION ALL
    SELECT N'https://stackoverflow.com need to fetch first 3 records. please help on this.' AS NOTE 
)
SELECT * FROM CTE
WHERE dbo.fn_Contains_Non_English_Char(NOTE) = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2021-09-22
    • 2018-04-18
    • 1970-01-01
    • 2012-02-23
    • 2013-08-30
    相关资源
    最近更新 更多