SQLite:使用包含多分隔符的字符串中的 X 列的子字符串更新 Y 列

SQLite: UPDATE column Y with a sub-string from column X in a string containing multi-separators

我有一个包含两列 PARTNAME 和 POSTFIX 的 table。 PARTNAME - 构造部分的名称由不同的子字符串组成,以“-”分隔。语法:

aaaa-bbbb-ddddd-ccc-gggg

每个子串的长度都是动态的,partnames中'-'的数量也是动态的。我想将最后一个“-”之后的子字符串 (ggggggg) 放入现在为空的 POSTFIX 列中。我正在寻找 GENERIC 答案,但我问自己我该如何...

这是我现在的代码,但它是静态的并且不起作用:

update parts
set postfix = case 
    when instr(partname, '-') > 0 then substr(partname, length(partname) - 3, 4)
    else NULL
end

乱七八糟的,不过根据这个问题的回答How to get the last index of a substring in SQLite?

SQLFiddle with live example here 这可能效率不高。它很丑。那是肯定的!

至于可变数量的破折号,好吧,如果破折号的数量无关紧要,您可以先执行查询,将所有双破折号 '--' 替换为单破折号 '-'。 运行 如果出现两个以上的破折号,则必要时多次。

SQLite 解决方案

CREATE TABLE `parts` (
  `partname`    TEXT,
  `postfix1`    TEXT,
  `postfix2`    TEXT,
  `postfix3`    TEXT
);


INSERT INTO `parts`
  (`partname`)
VALUES
  ('aaaa-bbbb-ddddd-ccc-ggggggg'),
  ('aaaa-bbbbb-dddd-cccc-gggggg'),
  ('aaaa-bbbbbb-ddd-ccccc-ggggg'),
  ('aaaa-bbbbbbb-dd-cccccc-gggg')
;


UPDATE `parts`
SET `postfix1` = CASE 
    WHEN instr(`partname`, '-') > 0 THEN
      replace(`partname`, rtrim(`partname`, replace(`partname`, '-', '')), '')
    ELSE NULL
END;

UPDATE `parts`
SET `postfix3` = CASE 
    WHEN instr(`partname`, '-') > 0 THEN
      replace(`partname`, rtrim(
        rtrim( rtrim(`partname`, replace(`partname`, '-', '')), '-'),
      replace(`partname`, '-', '')), '')
    ELSE NULL
END;

UPDATE `parts`
SET `postfix2` = CASE 
    WHEN instr(`partname`, '-') > 0 THEN

    replace(

        replace(`partname`,
            '-' || replace(`partname`, rtrim( rtrim( rtrim(`partname`, replace(`partname`, '-', '')), '-'), replace(`partname`, '-', '')), ''),
        ''),

        rtrim(

          replace(`partname`,
            '-' || replace(`partname`, rtrim( rtrim( rtrim(`partname`, replace(`partname`, '-', '')), '-'), replace(`partname`, '-', '')), ''),
          ''),

            replace(
              replace(`partname`,
                '-' || replace(`partname`, rtrim( rtrim( rtrim(`partname`, replace(`partname`, '-', '')), '-'), replace(`partname`, '-', '')), ''),
              ''),
            '-', '')
        ),
    '')
    ELSE NULL
END;

SELECT * FROM `parts`;

给出结果

partname                        postfix1    postfix2   postfix3
--------------------------------------------------------------------
"aaaa-bbbb-ddddd-ccc-ggggggg"   "ggggggg"   "ddddd"    "ccc-ggggggg"
"aaaa-bbbbb-dddd-cccc-gggggg"   "gggggg"    "dddd"     "cccc-gggggg"
"aaaa-bbbbbb-ddd-ccccc-ggggg"   "ggggg"     "ddd"      "ccccc-ggggg"
"aaaa-bbbbbbb-dd-cccccc-gggg"   "gggg"      "dd"       "cccccc-gggg"