SQL — Замена символов в строке SQL

#sql

Вопрос:

Я хотел бы знать, как заменить все символы между 2 тире ( — ), а также заменить тире. Это должно быть в одном операторе select, а не в цикле. Текст между тире может быть переменной длины и любым символом. Символы до и после тире также могут быть переменной длины.

         141911001-200-20     = 14191100120  // Replaced -200-
        141911001-10-50      = 14191100150  // Replaced -10-
        141911001-50-10      = 14191100110  // Replaced -50-
        141911001-aaaa-85    = 14191100185  // Replaced --aaaa--
        11111111111-bbbbb-4444 = 111111111114444 //Replace-bbbbb-
 

Комментарии:

1. Отметьте свой вопрос в базе данных, которую вы используете.

Ответ №1:

Вы можете сделать это с помощью CHARINDEX, ПОДСТРОКИ и LEN

 CREATE TABLE #TEMP
(
  test_value VARCHAR(20)
)

INSERT INTO #TEMP
VALUES ('141911001-200-20')
,('141911001-10-50')
, ('141911001-50-10')
,('141911001-aaaa-85')

SELECT SUBSTRING(test_value, CHARINDEX('-', test_value), LEN(test_value)) AS subFirstDash -- Substring starts on the first dash (-) index
 , CHARINDEX('-', SUBSTRING(test_value, CHARINDEX('-', test_value)   1, LEN(test_value))) AS lastDashIndex -- Last dash(-) index from the previous substring
 , SUBSTRING(SUBSTRING(test_value, CHARINDEX('-', test_value)   1, LEN(test_value)), 0, CHARINDEX('-', SUBSTRING(test_value, CHARINDEX('-', test_value)   1, LEN(test_value)))) AS btwDashes -- Value between dashes (-)
 , REPLACE(test_value, '-'   SUBSTRING(SUBSTRING(test_value, CHARINDEX('-', test_value)   1, LEN(test_value)), 0, CHARINDEX('-', SUBSTRING(test_value, CHARINDEX('-', test_value)   1, LEN(test_value))))   '-', '') AS new_value -- Value between dashes (-) replaced 
 , test_value AS original_value
FROM #TEMP

DROP TABLE #TEMP
 

Проверьте эту скрипку

Комментарии:

1. Блестяще именно то, что я искал

Ответ №2:

Это отвечает на исходную версию вопроса.

В ваших образцах данных первый и последний элементы имеют одинаковую длину, поэтому вы можете использовать строковые операции. Большинство баз данных имеют left() right() функции и (в противном случае используйте substr() функцию).

Итак, если это в целом верно, вы можете использовать:

 left(col, 9) || right(col, 3)
 

Комментарии:

1. Хорошая мысль, но, к сожалению, первый и последний элементы также могут быть переменной длины. У меня есть обновленный вопрос