Заменить функцию, сохранить неизвестные подстроки / подстановочные знаки - PullRequest
0 голосов
/ 06 марта 2019

Я пытался искать ответы в Интернете, но мне не хватает правильной номенклатуры, чтобы найти ответы, соответствующие моему вопросу.

БД, с которой я работаю, - непоследовательный беспорядок. В настоящее время я пытаюсь импортировать несколько кодов обслуживания, которые я должен связать с уже существующей таблицей Excel. По этой причине код обслуживания, который я импортирую, должен быть очень универсальным. Таблица предназначена для работы с 2-3-значным числом (длительностью), за которым следует единица времени.

Например, SERV-01W и SERV-03M.

Так как они добавлялись в БД вручную, большое количество старых кодов обслуживания фактически пишется с 1-значными числами.

Например, SERV-1W и SERV-3M.

Я хотел бы заменить старые коды новыми кодами. Другими словами, я хочу добавить начальный 0, если в коде используется только одна цифра.

REPLACE(T.Code,'-[0-9][DWM]','-0[0-9][DWM]') к сожалению, не работает, скорее всего, потому что я использую символы подстановки в строке результата.

Что было бы хорошим способом решения этой проблемы?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Предполагая, что я понимаю ваше требование, вы получите то, что вам нужно:

WITH VTE AS(
    SELECT *
    FROM (VALUES('SERV-03M'),
                ('SERV-01W'),
                ('SERV-1Q'),
                ('SERV-4X')) V(Example))
SELECT Example,
       ISNULL(STUFF(Example, NULLIF(PATINDEX('%-[0-9][A-z]%',Example),0)+1,0,'0'),Example) AS NewExample
FROM VTE;

Вместо того, чтобы пытаться заменить шаблон, я использовал PATINDEX, чтобы найти шаблон, а затем ввести дополнительные '0' персонаж.Если шаблон не был найден, поэтому PATINDEX вернул 0, я вынудил выражение вернуть NULL, а затем обернул всю вещь еще одним ISNULL, чтобы было возвращено исходное значение.

0 голосов
/ 06 марта 2019

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

SELECT (CASE WHEN code LIKE '%-[0-9][0-9]%'
             THEN code
             ELSE REPLACE(code, '-', '-0')
        END)

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

Это не обобщается (например, не добавляет двух нулей), но делает именно то, что вы просите.

...