Проблема с patindex и символом юникода '-'

У меня есть строка с именем Dats что либо из общего внешнего вида xxxx-nnnnn (где x это персонаж, и n это число) или nnn-nnnnnn,

Я хочу вернуть только цифры.

Для этого я попробовал:

SELECT Distinct dats, 
Left(SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000), PatIndex('%[^0-9.-]%', SubString(artikelnr, PatIndex('%[0-9.-]%', artikelnr), 8000) + 'X')-1)
FROM ThatDatabase

Это почти то, что я хочу. Удаляет обычные символы x, но это не удаляет символ Unicode -, Как я могу удалить это также? А также, кажется, довольно неэффективно иметь два PatIndex функции для каждой строки, есть ли способ избежать этого? (Это будет использоваться в большой базе данных, где результат этого запроса будет использоваться в качестве ключей).

РЕДАКТИРОВАТЬ: обновляется как новая база данных иногда содержит дополнительные -или . вместе с -,

DECLARE @T as table
(
    dats nvarchar(10)
)

INSERT INTO @T VALUES
('111BWA30'),
('115-200-11')
('115-22.4-1')
('10.000.22')
('600F-FFF200')

2 ответа

Решение

Я не был уверен, если вы хотели цифры до - char, но если вы это сделаете, вот один из способов сделать это:

Создайте и заполните образец таблицы (пожалуйста, сохраните этот шаг в ваших будущих вопросах)

DECLARE @T as table
(
    dats nvarchar(10)
)

INSERT INTO @T VALUES
('abcde-1234'),
('23-343')

Запрос:

SELECT  dats,
        case when patindex('%[^0-9]-[0-9]%', dats) > 0 then
            right(dats, len(dats) - patindex('%-[0-9]%', dats))
        else
            stuff(dats, charindex('-', dats), 1, '')
        end As NumbersOnly
FROM @T

Результаты:

dats        NumbersOnly
abcde-1234  1234
23-343      23343

Если вы хотите только цифры справа от - char, это проще:

SELECT  dats,
        right(dats, len(dats) - patindex('%-[0-9]%', dats)) As RightNumbersOnly
FROM @T

Результаты:

dats        RightNumbersOnly
abcde-1234  1234
23-343      343

Если вы знаете, какие символы нужно удалить, используйте REPLACE функция

DECLARE @T as table
(
    dats nvarchar(100)
)

INSERT INTO @T 
VALUES
('111BWA30'),
('115-200-11'),
('115-22.4-1'),
('10.000.22'),
('600F-FFF200')

SELECT REPLACE(REPLACE(dats, '.', ''), '-', '')
FROM @T
Другие вопросы по тегам