是否有一种方法可以仅替换字段值中特定出现的关键字,而不使用 SQLite 替换所有出现的关键字?

问题描述 投票:0回答:1

给定一个表

'updates'
,其中包含由两个字段组成的记录,两个字段都仅包含文本:

existing_value
replacement_value

此表用于更新第二个表

'main'
,其中包含单个字段:

name

其中

name
字段将更新为
replacement_value
,用
existing_value
替换
replacement_value
的所有实例。然而,我们需要的并不是在
'main'
的基础上替换
main.name = updates.repleacement_value
表的简单更新,其中
main.name = updates.existing_value

main.name
updates.existing_value
updates.replacement_value
都包含采用简单值形式的字符串,例如
Joe
,或者它们可以(并且大多数情况下)包含包含分隔符的字符串,以分隔单个字段中保存的多个值例如
'Joe Soap\\Joe Bloggs\\Joe'
(是的,我知道字段填充是一个糟糕的主意,但源数据就是这样)。

为了澄清起见,我们假设一个适用以下内容的示例:

updates.existing_value = 'Joe'
updates.replacement = 'Jose'

Main 有两条记录:

main.name = 'Joe Soap\\Joe Bloggs\\Joe'

main.name
= '乔肥皂\乔\小乔'

我需要解决的问题是仅将每个记录中的独立“Joe”替换为

'Jose'
,而不会无意中影响“Joe Soap”、
'Joe Bloggs'
'Joe Little'

解决问题的一种方法是将

'main'
中的每条记录加载到 Python 中,将每条记录转换为列表,处理列表并重新编译字符串,然后将其写回
'main'
(数据帧是最有效的),但在走这条路之前,我想知道是否有办法直接在 SQLite 中实现相同的目的?

我已经尝试过类似,

INSTR()
REPLACE()
,但似乎没有办法缩小 REPLACE() 的范围,因为它将用
'Joe'
替换
'Jose'
的所有实例.

是否有其他一些我没有考虑过的

SQL
方法,或者问题最好在外部解决还是
SQLite

sqlite replace
1个回答
0
投票

您可以分隔搜索词:

update main
set name = map.new from (
  select
    main.rowid as id,
    substr(
      replace(
        '\'||main.name||'\',
        '\'||updates.existing_value||'\',
        '\'||updates.replacement||'\'
      ),
      2,
      length(main.name) + (length(updates.replacement)-length(updates.existing_value))
    ) as new
  from main inner join updates
  where instr('\'||main.name||'\', '\'||updates.existing_value||'\')
) as map
where main.rowid = map.id;

(我的语法可能不太正确。)

© www.soinside.com 2019 - 2024. All rights reserved.