2012-01-19 56 views
2

我与Microsoft SQL Server工作正则表达式2008年SQL查询 - 所有字母

我想从一个执行所有字母检查,以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]%'; 

我得到 '萨尔' 值:222222222和2G23222

的字母不被替换。

我在网上查了正则表达式模式,得到了A到Z的所有字母[A-Z]。我的sql在某处出错了吗? 如果我将[0-9]替换,它也不起作用。

请帮忙。 谢谢。

回答

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 

这会不会是一种非常有效的方法,但如果这只是一次性的清理,我不认为这应该是一个问题。在查询什么

0

化妆用的REGEXP[:alpha]

UPDATE dbo.Employee SET Sal = REPLACE(REPLACE(Sal,'-',''), ':', '')  
      WHERE Sal LIKE '%:%' OR Sal LIKE '%-%' OR Sal REGEXP '[:alpha]'; 

DOCUMENTATION ,希望这会帮助你