SQLite3:通过正则表达式查找列值的某个部分的匹配,并将其替换为另一个值。

时间:2017-07-16 10:41:51

标签: sql regex sqlite

我是SQL的绝对初学者。我知道如何使用属于数据操作语言和数据定义语言的SQL命令。

表格的名称为ways_tags

id,key,value,type

164931009,street,6th Main Road Ram Nagar (N) Extn,addr

标题代表列名,我只打印了一行。

这就是我想要完成的事情:

  1. 选择typeaddrkeystreet的观察结果。

  2. 在此类观察中,扫描value列的字符,检查后4个字符是否与Extn匹配,并将其替换为Extension

  3. 另外,有没有办法可以减少代码的大小,它会检查两种模式而不是一种?

    换句话说

    您可以使用

    等替换我想要完成的内容。
    1. 在此类观察中,扫描value列的字符:

      我。如果value列中的最后4个字符Extn替换为Extension

      ii。如果value列中的最后2个字符St.替换为Street

    2. 我真的很抱歉,但我只知道伪代码并且不知道如何将正则表达式与普通SQL结合使用,所以我无法发布任何内容来表明我的情况。我试过了。

      所以最终执行完步骤后,

      164931009,street,6th Main Road Ram Nagar (N) Extension,addr 
      

      是更新的观察,而不是

      164931009,street,6th Main Road Ram Nagar (N) Extn,addr
      

1 个答案:

答案 0 :(得分:1)

  

选择typeaddrkeystreet的观察结果。
  ...扫描value列的字符,检查后4个字符是否与Extn匹配

WHERE type = 'addr'
  AND key = 'street'
  AND value LIKE '%Extn'
  

...并将其替换为Extension

如果值中的其他位置没有出现“Extn”,则可以使用replace()完成此操作,但在一般情况下,您必须extract除了最后四个字符,并附加新值:

substr(value, 1, length(value) - 4) || 'Extension'

然后将其插入UPDATE语句:

UPDATE ways_tags
SET value = substr(value, 1, length(value) - 4) || 'Extension'
WHERE type = 'addr'
  AND key = 'street'
  AND value LIKE '%Extn';

使用CASE expression可以在单个语句中执行两次替换,但不会减少代码大小。