我正在使用 Microsoft SQL Server 2008。
我想对从 A 到 Z 的所有字母表执行检查,特殊字符如:“:”和“-”用于表中一列中的值。
我可以算出“:”和“-”。我如何考虑 A 到 Z 之间的值?
我试过类似的方法,但它没有为我执行替换选项。
INSERT INTO Employee (Name, PhoneNo, Sal) VALUES ('Joe Wang', '666 2323', 222222222);
INSERT INTO Employee (Name, PhoneNo, Sal) VALUES ('John Doe','666 2323', '2G23:22-2' );
UPDATE dbo.Employee
SET Sal = REPLACE(REPLACE(Sal,'-',''), ':', '')
WHERE Sal LIKE '%:%' OR Sal LIKE '%-%' OR Sal LIKE '%[A-Z]%';
我得到的“Sal”值为:222222222 和 2G23222
字母不会被替换。
我在线检查了正则表达式模式并得到了从 A 到 Z 的所有字母表的 [A-Z]。我的 sql 是不是哪里出错了? 如果我替换 [0-9] 也不起作用。
请帮忙。 谢谢。
最佳答案
失败是因为您的 REPLACE
语句没有尝试替换字母,并且您不能在 REPLACE
中使用模式匹配。
您应该尝试不同的方法,而不是尝试查找与有效字符(数字?)不匹配的任何字符,然后替换该字符。
Here's a blog post that contains a UDF that does just this :
CREATE FUNCTION dbo.UFNG_ONLY_DIGITS (@StrVal AS VARCHAR(max))
RETURNS VARCHAR(max)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%', @StrVal) > 0
SET @StrVal = REPLACE(@StrVal,
SUBSTRING(@StrVal,PATINDEX('%[^0-9]%', @StrVal),1),'')
RETURN @StrVal
END
然后您可以将更新语句写成:
UPDATE dbo.Employee
SET Sal = dbo.UFNG_ONLY_DIGITS (Sal)
WHERE PATINDEX('%[^0-9]%', Sal) > 0
这不是一种非常有效的方法,但如果这只是一次性清理,我认为这应该不是问题。
关于SQL 查询 - 所有字母表的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8930877/