Разделение и конкатенация Sql Server

#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 не указано. =]