Как удалить любые конечные числа из строки? - PullRequest
7 голосов
/ 10 февраля 2012

Примеры ввода:

«Привет, как дела?»

«Какая пиццерия №1 в Нью-Йорке?»

«Домино - это номер»1 "

" Бла-бла 123123 "

" Больше бла 12321 123123 123132 "

Ожидаемый результат:

" Привет!как дела?

"Что такое пиццерия №1 в Нью-Йорке?"

"Домино - это число"

"Бла-бла"

"More blah "

Я думаю, что это двухэтапный процесс:

  1. Разделить всю строку на символы, по одной строке на символ (включая пробелы), в reverse order
  2. Цикл, и для каждого, если это пробел или число, пропустите, в противном случае добавьте к start другого массива.

И я должен в итоге получить желаемый результат.

Я могу придумать несколько быстрых и грязных способов, но это должно работать довольно хорошо, так как это триггер, который запускается на занятом столе, поэтомуЯ подумал, что выкину это профессионалам T-SQL.

Есть предложения?

Ответы [ 5 ]

4 голосов
/ 10 февраля 2012

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

 CREATE FUNCTION dbo.trim_ending_numbers(@columnvalue AS VARCHAR(100)) RETURNS VARCHAR(100)
    BEGIN
    --This will make the query more efficient by first checking to see if it contains any numbers at all
    IF @columnvalue NOT LIKE '%[0-9]%'
        RETURN @columnvalue

    DECLARE @counter INT
    SET @counter = LEN(@columnvalue)

    IF ISNUMERIC(SUBSTRING(@columnvalue,@counter,1)) = 0
        RETURN @columnvalue 

    WHILE ISNUMERIC(SUBSTRING(@columnvalue,@counter,1)) = 1 OR SUBSTRING(@columnvalue,@counter,1) = ' '
    BEGIN
        SET @counter = @counter -1
        IF @counter < 0
            BREAK
    END
    SET @columnvalue = SUBSTRING(@columnvalue,0,@counter+1)

    RETURN @columnvalue
    END

Если вы запустите

SELECT dbo.trim_ending_numbers('More blah 12321 123123 123132')

Вернется

'More blah'
3 голосов
/ 07 января 2015

Я считаю, что приведенный ниже запрос быстрый и полезный

select reverse(substring(reverse(colA),PATINDEX('%[0-9][a-z]%',reverse(colA))+1,
len(colA)-PATINDEX('%[0-9][a-z]%',reverse(colA))))
from TBLA
3 голосов
/ 10 февраля 2012

Цикл на занятом столе вряд ли будет работать адекватно.Используйте REVERSE и PATINDEX, чтобы найти первую не цифру, начните там SUBSTRING, затем ОБРАТИТЕ результат.Это будет очень медленно без циклов.

Ваши примеры подразумевают, что вы также не хотите совпадать с пробелами.

DECLARE @t TABLE (s NVARCHAR(500))
INSERT INTO @t (s)
VALUES 
('Hi there how are you'),('What is the #1 pizza place in NYC?'),('Dominoes is number 1'),('Blah blah 123123'),('More blah 12321 123123 123132')

select s 
, reverse(s) as beginning
, patindex('%[^0-9 ]%',reverse(s)) as progress
, substring(reverse(s),patindex('%[^0-9 ]%',reverse(s)), 1+len(s)-patindex('%[^0-9 ]%',reverse(s))) as [more progress]
, reverse(substring(reverse(s),patindex('%[^0-9 ]%',reverse(s)), 1+len(s)-patindex('%[^0-9 ]%',reverse(s)))) as SOLUTION
from @t

Окончательный ответ: обратный (подстрока (обратная (@s)), patindex ('% [^ 0-9]%', обратный (@s)), 1 + len (@s) - patindex ('% [^ 0-9]%', обратный (@s))))

0 голосов
/ 20 июля 2012

Спасибо за все вклады, которые были очень полезны. Чтобы пойти дальше и извлечь из него ТОЛЬКО трейлинг-номер:

, substring(s, 2 + len(s) - patindex('%[^0-9 ]%',reverse(s)), 99) as numeric_suffix

Мне нужно было сортировать по числовому суффиксу, поэтому пришлось ограничить шаблон числовыми значениями и обойти числа разной длины, сортируя их по тексту (т. Е. Я хотел, чтобы 2 отсортировали до 19), приведя результат:

,cast(substring(s, 2 + len(s) - patindex('%[^0-9]%',reverse(s)),99) as integer) as numeric_suffix
0 голосов
/ 10 февраля 2012
--DECLARE @String VARCHAR(100) = 'the fat cat sat on the mat'
--DECLARE @String VARCHAR(100) = 'the fat cat 2 sat33 on4 the mat'
--DECLARE @String VARCHAR(100) = 'the fat cat sat on the mat1'
--DECLARE @String VARCHAR(100) = '2121'
DECLARE @String VARCHAR(100) = 'the fat cat 2 2 2 2 sat on the mat2121'



DECLARE @Answer NVARCHAR(MAX),
    @Index INTEGER = LEN(@String),
    @Character CHAR,
    @IncorrectCharacterIndex SMALLINT


-- Start from the end, going to the front.
WHILE @Index > 0 BEGIN

    -- Get each character, starting from the end
    SET @Character = SUBSTRING(@String, @Index, 1)

    -- Regex check.
    SET @IncorrectCharacterIndex = PATINDEX('%[A-Za-z-]%', @Character)

    -- Is there a match? We're lucky here because it will either match on index 1 or not (index 0)
    IF (@IncorrectCharacterIndex != 0)
    BEGIN
        -- We have a legit character.
        SET @Answer = SUBSTRING(@String, 0, @Index + 1)
        SET @Index = 0
    END
    ELSE
        SET @Index = @Index - 1 -- No match, lets go back one index slot.


END

PRINT LTRIM(RTRIM(@Answer))

ПРИМЕЧАНИЕ. Я включил тире в правильное соответствие регулярному выражению.

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