【问题标题】:SQLite string search in rows then insert string into new rows with values of the same row last columnSQLite 在行中搜索字符串,然后将字符串插入到新行中,最后一列的值相同
【发布时间】:2022-07-17 04:25:31
【问题描述】:

我想向我的数据库提供一个查询,该查询将搜索 column2 (site_id) 中是否存在字符串,然后将该字符串放入一个新表中,并在该行中使用其前列的值。

表格只有 2 列,site_id 列可能有很多我想要的 5 字字符串。

在此处显示的示例中,我想获取所有特定站点 ID。例如:E7089 或 E7459(我需要所有这些,第一个单词是随机的,如 E 或 T 等,四个数字是可变的)

当前的第一行是这样的:有一个 ticket_id 和许多 site_ids(我只需要像:g1231 或 g1236 这样的站点 ID,而不是括号中的地址)

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 的行并插入所有与搜索匹配的行,我不希望这样。

有人可以帮助将第一个转换为第二个吗?

目前的db基本上是这样的:

column1 | 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_ids(我已经可以用正则表达式找到它们),需要像上面提到的那样分隔成新的行。

  • 只需要在sqlite db浏览器和db浏览器中完成(它是这样分配的,必须这样完成,所以不幸的是没有python)

【问题讨论】:

    标签: sqlite sql-insert recursive-query substr db-browser-sqlite


    【解决方案1】:

    您需要递归 CTE 来拆分表 test1site_id 列,并使用 SUBSTR() 函数将前 5 个字符插入表 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

    【讨论】:

    • 很多人你是神@forpas
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多