在行中搜索 SQLite 字符串,然后将字符串插入到新行中,其值与最后一列的同一行相同
SQLite string search in rows then insert string into new rows with values of the same row last column
我想向我的数据库提供一个查询,该查询将搜索 Column2(site_id) 中是否存在一个字符串,然后将该字符串放入一个新的 table 中,其前一列的值为那一行。
table只有2列,site_id列可能有很多我想要的5字串。
在下面的示例中,我想获取所有特定站点 ID。例如:E7089 或 E7459(我需要所有这些,第一个单词是随机的,如 E 或 T 等,四位数字是可变的)
当前第一行是这样的:有一个ticket_id和许多site_ids(我只需要站点ID like:g1231或g1236而不是括号中的地址)
ticket_id | site_id |
sss-bb-12312312-12312 | g1231(afsdgf-sdgsdgdg), g1236(sdfsdgsdg), g3212(asdfas-dfsd), b2311(asdasd), b3213(asdfsdf)
然后像这样:
ticket_id | site_id |
sss-bb-12312312-12312 g1231
sss-bb-12312312-12312 g3211
sss-bb-12312312-12312 g1236
sss-bb-12312312-12312 b2311
sss-bb-12312312-12312 b3213
我已经可以搜索整个第二列并使用正则表达式找到 5 个单词的网站 ID(如果你想尝试:[A-Z]\d{1,4}),但我无法从行并将它们中的每一个插入一个新行,我当前的代码是这样的:
drop TABLE if EXISTS test2;
CREATE TABLE if NOT EXISTS test2 (
Ticket_id varchar,
site_id varchar
);
INSERT INTO test2
SELECT ticket_id, site_id
FROM TEST WHERE site_id regexp '[A-Z]\d{1,4}';
但上面的代码会找到包含 site_id 的行并插入所有与搜索匹配的行,我不希望这样。
有人可以帮助将第一个转换为第二个吗?
基本上当前的数据库是这样的:
culumn1 | column2
ticket1 | many site ids
ticket2 | many site ids
但我想要这样:
culumn1 | column2
ticket1 | id
ticket1 | id
ticket1 | id
ticket1 | id
ticket2 | id
ticket2 | id
ticket2 | id
-门票不需要任何更改,只需将其复制到新的行中并指定 site_id
-每张票有很多 site_id(我已经可以用正则表达式找到它们)需要像上面提到的那样分隔到新行。
-它需要在 sqlite 数据库浏览器和数据库浏览器中完成(它是这样分配的,必须那样做,所以不幸的是没有 python)
您需要一个递归 CTE 来拆分 table test1
的 site_id
列和 SUBSTR() 函数以将前 5 个字符插入 table test2
:
WITH cte AS (
SELECT ticket_id, '' site_id, site_id || ',' s
FROM test1
UNION ALL
SELECT ticket_id,
SUBSTR(s, 0, INSTR(s, ',')),
SUBSTR(s, INSTR(s, ',') + 1)
FROM cte
WHERE s <> ''
)
INSERT INTO test2 (ticket_id, site_id)
SELECT ticket_id, SUBSTR(TRIM(site_id), 1, 5)
FROM cte
WHERE site_id <> '';
参见demo。
我想向我的数据库提供一个查询,该查询将搜索 Column2(site_id) 中是否存在一个字符串,然后将该字符串放入一个新的 table 中,其前一列的值为那一行。
table只有2列,site_id列可能有很多我想要的5字串。
在下面的示例中,我想获取所有特定站点 ID。例如:E7089 或 E7459(我需要所有这些,第一个单词是随机的,如 E 或 T 等,四位数字是可变的)
当前第一行是这样的:有一个ticket_id和许多site_ids(我只需要站点ID like:g1231或g1236而不是括号中的地址)
ticket_id | site_id |
sss-bb-12312312-12312 | g1231(afsdgf-sdgsdgdg), g1236(sdfsdgsdg), g3212(asdfas-dfsd), b2311(asdasd), b3213(asdfsdf)
然后像这样:
ticket_id | site_id |
sss-bb-12312312-12312 g1231
sss-bb-12312312-12312 g3211
sss-bb-12312312-12312 g1236
sss-bb-12312312-12312 b2311
sss-bb-12312312-12312 b3213
我已经可以搜索整个第二列并使用正则表达式找到 5 个单词的网站 ID(如果你想尝试:[A-Z]\d{1,4}),但我无法从行并将它们中的每一个插入一个新行,我当前的代码是这样的:
drop TABLE if EXISTS test2;
CREATE TABLE if NOT EXISTS test2 (
Ticket_id varchar,
site_id varchar
);
INSERT INTO test2
SELECT ticket_id, site_id
FROM TEST WHERE site_id regexp '[A-Z]\d{1,4}';
但上面的代码会找到包含 site_id 的行并插入所有与搜索匹配的行,我不希望这样。 有人可以帮助将第一个转换为第二个吗? 基本上当前的数据库是这样的:
culumn1 | column2
ticket1 | many site ids
ticket2 | many site ids
但我想要这样:
culumn1 | column2
ticket1 | id
ticket1 | id
ticket1 | id
ticket1 | id
ticket2 | id
ticket2 | id
ticket2 | id
-门票不需要任何更改,只需将其复制到新的行中并指定 site_id
-每张票有很多 site_id(我已经可以用正则表达式找到它们)需要像上面提到的那样分隔到新行。
-它需要在 sqlite 数据库浏览器和数据库浏览器中完成(它是这样分配的,必须那样做,所以不幸的是没有 python)
您需要一个递归 CTE 来拆分 table test1
的 site_id
列和 SUBSTR() 函数以将前 5 个字符插入 table test2
:
WITH cte AS (
SELECT ticket_id, '' site_id, site_id || ',' s
FROM test1
UNION ALL
SELECT ticket_id,
SUBSTR(s, 0, INSTR(s, ',')),
SUBSTR(s, INSTR(s, ',') + 1)
FROM cte
WHERE s <> ''
)
INSERT INTO test2 (ticket_id, site_id)
SELECT ticket_id, SUBSTR(TRIM(site_id), 1, 5)
FROM cte
WHERE site_id <> '';
参见demo。