我正在使用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]替换它也不起作用。
请帮忙。 谢谢。
答案 0 :(得分:0)
它失败了,因为您的REPLACE
语句不会尝试替换这些字母,并且您无法在REPLACE
中使用模式匹配。
您应该尝试不同的方法,而是尝试查找与有效字符(Numbers?)不匹配的任何字符,然后替换该字符。
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
这不是一种非常有效的方法,但如果这只是一次性清理,我认为不应该是一个问题。
答案 1 :(得分:0)
在您的查询中使用REGEXP
和[:alpha]
,例如
UPDATE dbo.Employee SET Sal = REPLACE(REPLACE(Sal,'-',''), ':', '')
WHERE Sal LIKE '%:%' OR Sal LIKE '%-%' OR Sal REGEXP '[:alpha]';
<强> DOCUMENTATION 强> ,希望这会对你有所帮助