SQL заменить и рассчитать длину символа и заменить снова - PullRequest
3 голосов
/ 27 февраля 2020

Я хочу сделать обновление для таблицы Firebird. Пока что нет проблем:

update MYTABLE
set params = replace(params, 'SOMEHOST', 'SOMENEWHOST')

До утверждения обновления мои параметры выглядят так:

s:91:"{"server":"SOMEHOST","port":"21","ssl":false,"user":"DUMMY","pwd":"SECRET","path":"FOLDER"}";

После моего обновления параметры выглядят так:

s:91:"{"server":"SOMENEWHOST","port":"21","ssl":false,"user":"DUMMY","pwd":"SECRET","path":"FOLDER"}";

Пока все в порядке.

Но внешняя программа не может справиться с этим, поскольку в параметрах есть контрольная сумма.

Значение s: 91 - это символ длина от открывающей скобки до закрывающей.

Длина строки может отличаться от строки к строке, поскольку существует другой путь, пользователь или pwd.

Можно ли рассчитать длину символа из открывающая скобка для закрытия и расширение оператора обновления с помощью Firebird?

1 Ответ

3 голосов
/ 27 февраля 2020

Сначала вы заменяете старый хост новым хостом, а затем выполняете вторую замену, чтобы установить новый префикс размера.

Используйте функцию position, чтобы найти позиции "{" и "}" и построить строки "s: 91:" и "s: 94:", чтобы заменить их.

update MYTABLE set 
       PARAMS = replace(replace(PARAMS, 'SOMEHOST', 'SOMENEWHOST'), 
                       's:' || cast(position('}' in PARAMS) - position('{' in PARAMS) + 1 as varchar(16)) || ':',
                       's:' || cast(position('}' in replace(PARAMS, 'SOMEHOST', 'SOMENEWHOST')) - position('{' in PARAMS) + 1 as varchar(16)) || ':')

PS: было бы намного безопаснее, если бы при замене хоста вы также включили идентификатор. Поэтому, если случайно имя хоста является частью пароля или папки, они не будут изменены, что приведет к повреждению этих значений.

replace (PARAMS, '"server": "SOMEHOST"' , '"server": "SOMENEWHOST"')

вместо

replace (PARAMS, 'SOMEHOST', 'SOMENEWHOST')

Это делает этот результат запроса:

update MYTABLE set 
       PARAMS = replace(replace(PARAMS, '"server":"SOMEHOST"', '"server":"SOMENEWHOST"'), 
                       's:' || cast(position('}' in PARAMS) - position('{' in PARAMS) + 1 as varchar(16)) || ':',
                       's:' || cast(position('}' in replace(PARAMS, '"server":"SOMEHOST"', '"server":"SOMENEWHOST"')) - position('{' in PARAMS) + 1 as varchar(16)) || ':')
...