“创建sql函数,选择英文字符吗?”

时间:2019-08-30 09:44:36

标签: sql-server tsql

我正在寻找一个仅选择英文数字和字母的功能:

示例:

TEKA תנור ביל דין in HLB-840 P-WH לבן

我想运行一个函数并得到以下结果:

TEKA HLB-840 P-WH

我正在使用MS SQL Server 2012

4 个答案:

答案 0 :(得分:2)

这里真正需要的是正则表达式替换,SQL Server不支持它。广义上讲,您将希望找到[^A-Za-z0-9 -]+\s*,然后替换为空字符串。这是一个演示,表明它可以按预期工作:

Demo

这将为您提供的输入输出TEKA in HLB-840 P-WH。您可以使用正则表达式软件包或UDF在SQL Server中执行此操作。或者,您可以使用许多支持正则表达式的工具(例如C#)在SQL外部进行此替换。

答案 1 :(得分:1)

SQL-Server不是为此的正确工具。

以下内容可能对您有用,但不能保证:

declare @yourString NVARCHAR(MAX)=N'TEKA תנור ביל דין in HLB-840 P-WH לבן';
SELECT REPLACE(REPLACE(REPLACE(REPLACE(CAST(@yourString AS VARCHAR(MAX)),'?',''),' ','|~'),'~|',''),'|~',' ');

简而言之:

NVARCHAR强制转换为VARCHAR会将您字符串中所有在给定归类中不知道的字符返回为问号。其余的是问号和多空格的替换。

如果字符串中可以包含问号,则可以先将其替换为未使用的字符,然后在末尾重新替换。

如果字符串中可能包含|~,则应使用其他字符替换多空格。

如果某些字符跳过 ...

,则可以通过指定特定的排序规则来影响此方法

答案 2 :(得分:1)

没有用于此目的的内置函数,但是您可以创建自己的函数,应该是这样的:

--create function (split string, and concatenate required)
CREATE FUNCTION dbo.CleanStringZZZ ( @string VARCHAR(100))
RETURNS VARCHAR(100)
BEGIN   
    DECLARE @B VARCHAR(100) = '';
    WITH t --recursive part to create sequence 1,2,3... but will better to use existing table with index
      AS
        (
            SELECT n = 1
            UNION ALL
            SELECT n = n+1 --
            FROM   t
            WHERE  n <= LEN(@string)
        )
    SELECT   @B = @B+SUBSTRING(@string, t.n, 1)
    FROM     t
    WHERE    SUBSTRING(@string, t.n, 1) != '?' --this is just an example...
    --WHERE ASCII(SUBSTRING(@string, t.n, 1)) BETWEEN 32 AND 127 --you can use something like this
    ORDER BY t.n;
    RETURN @B;
END;

然后可以在select语句中使用此功能:

SELECT dbo.CleanStringZZZ('TEKA תנור ביל דין in HLB-840 P-WH לבן');

enter image description here

答案 3 :(得分:0)

create function dbo.AlphaNumericOnly(@string varchar(max))

returns varchar(max)

begin

   While PatIndex('%[^a-z0-9]%', @string) > 0

        Set @string = Stuff(@string, PatIndex('%[^a-z0-9]%', @string), 1, '')

return @string

end