2017-02-14 12 views
2

У меня есть строка под названием Dats, который является либо общей xxxx-nnnnn (Внешность, где x является характер, и n является числом) или nnn-nnnnnn.Проблема с PATINDEX и Юникода символа «-»

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

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

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 для каждой строки, есть ли способ избежать этого? (Это будет использоваться в большой базе данных, где результат этого запроса будет использоваться в качестве ключей).

EDIT: Обновлено как новая база данных, иногда содержит дополнительные - или . вместе с -.

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

Запрошенный вами запрос является синтаксически неправильным. –

ответ

4

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

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

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 

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

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

Результаты:

dats  RightNumbersOnly 
abcde-1234 1234 
23-343  343 
+0

Я хочу удалить любые символы и значения '-' из строки, чтобы остались только целые числа. Я вижу, что эта функция делает это. Мне нравится спрашивать, однако, так как это работает так хорошо, я тестировал его в другой базе данных, которая бы имела такую ​​же аппарантность, но теперь я вижу, что иногда она содержит более одного '-', а иногда и' .', а также '-' '. Есть ли опрятный способ приспособиться к этому? Скоро обновит OP примерную таблицу. – Cenderze

+0

Это требование очень отличается от первоначального запроса ... –

+0

Вы правы. Это слишком большое изменение для редактирования. Принимая ваш ответ и, возможно, подумайте о том, чтобы использовать мое «редактирование» в качестве более позднего вопроса после того, как я подумал еще раз об этом. Еще раз спасибо за прекрасный, ясный и продуманный ответ. – Cenderze

1

Если вы знаете, какие символы вам необходимо удалить затем использовать 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