#sql #sql-server #split #concatenation
#sql #sql-сервер #разделение #конкатенация
Вопрос:
У меня есть данные в следующем формате в таблице базы данных sql Server
[CPOID] [ContractPO] [ContractPOTitle]
1 10-SUP-CN-CNP-0001 Drytech
2 10-SUP-CN-CNP-0002 ECamp;M
Мне нужно написать хранимую процедуру для генерации следующего результата
[CPOID] [ContractPO] [ContractPOTitle] [ConcatField]
1 10-SUP-CN-CNP-0001 Drytech CNP-0001-Drytech
2 10-SUP-CN-CNP-0002 ECamp;M CNP-0002-ECamp;M
где [ConcatField] генерирует результат, разделяя последние два значения столбца [ContractPOTitle] и объединяя с [ContractPOTitle]
Комментарии:
1. Пожалуйста, опубликуйте код, который вы написали на данный момент. Обычно людям не нравится просто писать ваш код за вас. На самом деле это описание работы, а не вопрос.
2. Кроме того, вы можете указать, будет ли когда-либо изменяться форматирование чисел, потому что, если это произойдет, вам также нужно будет это спланировать. Возможно, вы захотите ознакомиться с функциями SubString и CharIndex , поскольку эти функции будут играть важную роль в том, чего вы хотите достичь. РЕДАКТИРОВАТЬ: я забыл о функции Reverse , вам также следует ознакомиться с этой функцией
Ответ №1:
Если поле ContractPO всегда имеет одинаковую длину, вы могли бы просто сделать:
SELECT
CPOID,
ContractPO,
ContractPOTitle,
RIGHT(ContractPO, 8) '-' ContractPOTitle as [ConcatField]
FROM MyTable
Предполагая, что длина поля ContractPO не является фиксированной, И мы должны полагаться на удаление текста после предпоследнего ‘-‘, следующий SQL будет работать. Это немного некрасиво, но эти типы операций необходимы, потому что, похоже, в SQL Server нет функции LASTINDEX, доступной из коробки.
SELECT
CPOID,
ContractPO,
ContractPOTitle,
RIGHT(ContractPO, CHARINDEX('-', REVERSE(ContractPO), CHARINDEX('-', REVERSE(ContractPO)) 1) - 1) '-' ContractPOTitle as [ConcatField]
FROM @myTable
Комментарии:
1. Ваш код предполагает, что формат файла ContractPO не изменится, OP нужно будет сообщить нам, что происходит после 10-SUP-CN-CNP-9999, является ли следующее число 10-SUP-CN-CNP-10000? Если это так, это приведет к сбою вашего решения. Лучшим подходом было бы вместо этого использовать SubString , CharIndex и Reverse .
2. @Отметьте, что вы правы, и я обновил свой ответ, чтобы разобрать текст после второго ‘-‘. Однако, просто хотел указать, что я уточнил свой первый ответ «Если поле ContractPO всегда имеет одинаковую длину», поскольку в OP не указано. =]