我正在寻找一个仅选择英文数字和字母的功能:
示例:
TEKA תנור ביל דין in HLB-840 P-WH לבן
我想运行一个函数并得到以下结果:
TEKA HLB-840 P-WH
我正在使用MS SQL Server 2012
答案 0 :(得分:2)
这里真正需要的是正则表达式替换,SQL Server不支持它。广义上讲,您将希望找到[^A-Za-z0-9 -]+\s*
,然后替换为空字符串。这是一个演示,表明它可以按预期工作:
这将为您提供的输入输出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 לבן');
答案 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