SQLite: UPDATE столбец Y с подстрокой из столбца X в строке, содержащей несколько разделителей - PullRequest
0 голосов
/ 13 января 2019

У меня есть таблица с двумя столбцами PARTNAME и POSTFIX. PARTNAME - имя строительной части состоит из разных подстрок, разделенных '-'. Синтаксис:

аааа-BBBB-DDDDD-ссс-ГГГГ

Длина каждой подстроки является динамической, количество '-' в именах деталей также является динамическим. Я хочу поместить подстроку (ggggggg) после LAST '-' в столбец POSTFIX, который сейчас пуст. Я ищу ответ GENERIC , но спрашиваю себя, как бы я ...

  • 1) ... поместить только подстроку "gggggg" в столбец POSTFIX
  • 2) ... поместить только подстроку "dddd" (3-я часть строки) в столбец POSTFIX
  • 3) ... поместить подстроку "cccc-gggg" в столбец POSTFIX

Вот мой код, но он статический и не работает:

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

1 Ответ

0 голосов
/ 15 января 2019

Это грязно, но на основании ответа на этот вопрос Как получить последний индекс подстроки в SQLite?

SQLFiddle с живым примером здесь Это может быть не так эффективно, как может быть. Это ужасно. Это точно!

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

Решение 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"
...