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 答案,但我问自己我该如何...
- 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
乱七八糟的,不过根据这个问题的回答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"
我有一个包含两列 PARTNAME 和 POSTFIX 的 table。 PARTNAME - 构造部分的名称由不同的子字符串组成,以“-”分隔。语法:
aaaa-bbbb-ddddd-ccc-gggg
每个子串的长度都是动态的,partnames中'-'的数量也是动态的。我想将最后一个“-”之后的子字符串 (ggggggg) 放入现在为空的 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
乱七八糟的,不过根据这个问题的回答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"