SQL Server - фильтровать содержимое поля только по номерам - PullRequest
1 голос
/ 27 мая 2010

Как мне скопировать значение поля, но только его числа?

Я создаю вычисляемый столбец для полнотекстового поиска и хочу скопировать в него значения из полей моего телефонного номера (которые являются varchar), но не с их форматированием - только числа. Что это за команда, которая будет делать это в моей формуле вычисляемого столбца?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 27 мая 2010

Вам нужно написать пользовательскую функцию для этого. Есть несколько способов сделать это, вот один, который я нашел с некоторым быстрым поиском в Google.

CREATE FUNCTION dbo.RemoveChars(@Input varchar(1000))
RETURNS VARCHAR(1000)
BEGIN
  DECLARE @pos INT
  SET @Pos = PATINDEX('%[^0-9]%',@Input)
  WHILE @Pos > 0
   BEGIN
    SET @Input = STUFF(@Input,@pos,1,'')
    SET @Pos = PATINDEX('%[^0-9]%',@Input)
   END
  RETURN @Input
END

Предупреждение: я бы не помещал это в условие WHERE для большой таблицы или в SELECT, которое возвращает миллионы строк, но это будет работать.

В конечном итоге вам, вероятно, лучше убрать нечисловые символы в пользовательском интерфейсе вашего приложения, чем в коде БД.

1 голос
/ 27 мая 2010

Предполагая, что есть только пара нечисловых символов, вложенные функции replace делают свое дело:

select replace(replace(replace(col1,'-',''),'(',''),')','')
from YourTable

Вы можете проверить, поймали ли вы все символы, например:

select col1
from YourTable
where col1 not like '%[-()0-9]%'

(В этом примере проверяются -, () и числа.)

0 голосов
/ 23 сентября 2016

Я понимаю, что это несколько более старый вопрос, но для этого не нужно прибегать к зацикливанию. И в наши дни мы должны стараться по возможности избегать скалярных функций, так как они не подходят для производительности. Мы можем использовать встроенную табличную функцию в сочетании с легкой поддержкой регулярных выражений, которые есть в SQL Server. Эта статья от Джеффа Модена объясняет это более подробно с точки зрения того, почему IsNumeric действительно не работает. http://www.sqlservercentral.com/articles/ISNUMERIC()/71512/

Суть его в том, что он создал изящную функцию.

CREATE FUNCTION dbo.IsAllDigits 
/********************************************************************
 Purpose:
 This function will return a 1 if the string parameter contains only 
 numeric digits and will return a 0 in all other cases.  Use it in
 a FROM clause along with CROSS APPLY when used against a table.

 --Jeff Moden
********************************************************************/
--===== Declare the I/O parameters
        (@MyString VARCHAR(8000))
RETURNS TABLE AS
 RETURN (
         SELECT CASE 
                WHEN @MyString NOT LIKE '%[^0-9]%'
                THEN 1
                ELSE 0
                END AS IsAllDigits
        )
0 голосов
/ 27 мая 2010

Я бы создал пользовательскую функцию, которую вы могли бы использовать при выборе и критериях, возможно, что-то вроде этого:

DECLARE @position int, @result varchar(50)
SET @position = 1
SET @result = ''

WHILE @position <= DATALENGTH(@input)
    BEGIN
    IF ASCII(SUBSTRING(@input, @position, 1)) BETWEEN 48 AND 57
        BEGIN
        SET @result = @result + SUBSTRING(@input, @position, 1)
        END
    SET @position = @position + 1
    END

RETURN @result

Удачи!

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