Динамическое решение, совместимое с SQLite, заключалось бы в вложении функций substr и instr для разделения списка на элементы и последующего применения логики замены к элементам.
Для таблицы strings
, в которой есть столбцы id
со значениями '1-42-9'
, '777-5-21'
и '7-55-123'
(так что вы уверены, что он работает с переменными длинами элементов и охватывает 1
против 111
case), это будет:
SELECT
input
,first_element || '-' ||
CASE second_element
WHEN '42' THEN 'ABC'
WHEN '5' THEN 'DEF'
ELSE second_element
END || '-' ||
third_element as output
FROM (
select
id as input,
substr(
id,
1,
instr(id,'-')-1
) as first_element,
substr(
substr(id,instr(id,'-')+1,100),
1,
instr(substr(id,instr(id,'-')+1,100),'-')-1
) as second_element
,substr(
substr(id,instr(id,'-')+1,100),
instr(substr(id,instr(id,'-')+1,100),'-')+1,
100
) as third_element
from strings
) t
fiddle
(может быть, красивее, но работает :))
это работает только для строковых списков, которые имеют 3 элемента, разделенных тире
если вы хотите заменить определенный элемент в любой позиции, просто примените тот же оператор CASE к first_element
и third_element
также, вы можете сделать это просто:
replace('-'||id||'-','-42-','-ABC-')
-если вы оберните строки в дополнительную пару тире, вы сможете искать 42
независимо от его положения (начало, середина, конец)