#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. Хорошая мысль, но, к сожалению, первый и последний элементы также могут быть переменной длины. У меня есть обновленный вопрос