SQL-запрос - шаблон регулярных выражений для всех алфавитов - PullRequest
2 голосов
/ 19 января 2012

Я работаю с Microsoft SQL Server 2008.

Я хочу выполнить проверку для всех алфавитов от 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].

Пожалуйста, помогите. Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 января 2012

используйте REGEXP и [:alpha] в вашем запросе что-то вроде

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

ДОКУМЕНТАЦИЯ надеюсь, это поможет вам

0 голосов
/ 19 января 2012

Сбой, потому что ваш оператор REPLACE не пытается заменить буквы, и вы не можете использовать сопоставление с шаблоном в REPLACE.

. Вы должны попробовать другой подход и вместо этого попытатьсянайдите любой символ, который не соответствует действительным символам (числа?), а затем замените этот символ.

Вот запись в блоге, содержащая UDF, которая делает именно это :

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

Это не будет очень эффективным подходом, но если это будет единовременная очистка, я не думаю, чтоэто должно быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...