【问题标题】:(SQL)Copy text after the last comma from one column to a new one(SQL)将最后一个逗号后的文本从一列复制到新列
【发布时间】:2017-07-20 15:38:36
【问题描述】:

我没有 mySQL,但我正在为数据库使用 DB Browser for SQLite

我目前正在设计一个关于伦敦房产的数据库,其中一列是地址。 例如,地址栏有:[Ovanna Mews, 19A Buckingham Road, N1]

表名:West2

我想将 N1 移动到名为 Postcode 的新列。

最终产品应如下所示:

       address column: **Ovanna Mews, 19A Buckingham Road**
      postcode column: **N1**

另一个例子:

(old) Lowndes Square, Knightsbridge, London, SW1X
(new) address column: Lowndes Square, Knightsbridge, London      
     postcode column: SW1X

PS:我的数据库里面有100多列,所以不会考虑手动更改它

【问题讨论】:

  • 请注意;你绝对确定最后一部分将永远是邮政编码吗?如果是用户输入,他们可能会输入:“Ovanna Mews, 19A Buckingham Road, N1, UNITED KINGDOM”或更可能是“Ovanna Mews, 19A Buckingham Road”
  • “N1”是您要移动的实际值,还是您要移动的最后一个分隔值?
  • 有些条目没有邮政编码,但至少 90% 的条目末尾有邮政编码。 N1 是我要移动的实际邮政编码。
  • 这在 SQLite 中很难做到,因为没有拆分功能。您可以切换到提供拆分功能的其他数据库,例如 MySql 和 Oracle。如果你不能这样做,你最好的办法是在 java/python 中编写代码并修改底层文本文件并将邮政编码作为新列分离出来。

标签: mysql sql database sqlite


【解决方案1】:

编辑:As you stated here 您可以将其编辑到google sheets,但不知道如何将import 编辑到数据库中,所以我会回答这个问题。你要找的是importing CSV file

EDIT2:请正确阅读您还需要知道如何split the values at G. Spreadsheets。这解释起来有点复杂,但做起来很容易......

首先在Google spreadsheet 上选择整个地址的列(通过单击列的字母)。转到标签Data > split text to columns...。由于您的列已经有逗号,它会将逗号之间的所有内容拆分为列。

| E            | F           | G            |  H    |
|:-------------|------------:|:------------:|:-----:|
|Lowndes Square|Knightsbridge|     London   |  SW1X |

现在您需要加入所需的列并添加逗号,您可以像这样在另一列上使用&", "& 来做到这一点:

=E2&", "&F2&", "&G2

注意可能有超过 4 列,因此很遗憾您需要手动调整要加入的列。

最后,对于这一部分,您需要将此新列仅复制为值,只需将其 ctrl + c 并将其粘贴到带有 CTRL + SHIFT + V(或 Edit tab > Paste Special > Paste values only)的另一列

然后,您需要从 G.Sheets 以 CSV 格式下载您的工作表:File > Download as > Comma-separated Values (CSV current spreadsheet)确保工作表的列顺序与 SQL 表相同,如果此工作表的第一行是列名,则删除该行

我建议为此创建另一个表(因为如果您不先清除它,您将拥有重复的数据 = 编辑邮政编码之前的数据和之后的数据)。然后,关注this post to import through SQLLite for browserFile > Import > Table from .CSV file > SHEET_GENERATED_BY_GSHEETS.csv,然后选择您的表。

我会在下面留下我之前的答案,以防有人从搜索引擎登陆。


如果当前address 中的postcode始终位于末尾且始终为 2 个字符且前面有逗号和空格,您可以先使用以下方法更新 postcode 中的值select addresssubstr 和更高版本的 updating address 组合,删除最后 4 位数字,组合 ltrimsubstr

第一部分,表是否有唯一的 ID/主键?

UPDATE a SET a.postcode = (select substr(b.address,-2,2) from table_name b where a.primarykey = b.primarykey)
FROM table_name a

第二部分:

UPDATE a SET a.address = (select ltrim(b.address,substr(b.address,-4,4)) from table_name b where a.primarykey = b.primarykey)
FROM table_name a

另外,我建议您复制包含所有数据的表并在这个新表上测试updates,然后再尝试真正的表。或者在执行 ROLLBACK 之前使用 BEGIN TRANSACTION 执行,以防出现任何问题。

【讨论】:

  • 感谢您的回复。邮政编码总是在最后,但它并不总是 2 个字符长,有些是 4 个字符长|(我已经在上面编辑过)。我想说他们中的大多数都有一个空格和一个逗号,但有些没有邮政编码。
  • 编辑了我的答案以符合您从谷歌表格导入的需要。
  • 刚读到您需要先拆分 Gsheets 上的值,我会将其添加到我的答案中
【解决方案2】:

我只是按照您在 MySQL 中的要求进行操作

 create table West2(Address varchar(100), postcode varchar(100));

insert into West2(address) values ('Ovanna Mews, 19A Buckingham Road, N1');

这个查询被执行并且结果符合预期

    mysql> select * from West2;
+--------------------------------------+----------+
| Address                              | postcode |
+--------------------------------------+----------+
| Ovanna Mews, 19A Buckingham Road, N1 | NULL     |
+--------------------------------------+----------+

正如您的问题所说,将“,”之后的最后一个字符串移动到字段postcode 我已经执行了以下命令

update West2 set postcode=SUBSTRING_INDEX(Address, ',', -1), Address=replace(Address,concat(',',SUBSTRING_INDEX(Address, ',', -1)), '');

执行查询后得到的结果是

mysql> select * from West2;
+----------------------------------+----------+
| Address                          | postcode |
+----------------------------------+----------+
| Ovanna Mews, 19A Buckingham Road |  N1      |
+----------------------------------+----------+

希望这对 SQLite DB 有所帮助

注意:这可能会在第一次执行后更改所有行,但如果您再次执行此查询,这将导致 , 从所有条目中删除,因此请仅执行一次。

【讨论】:

  • 感谢您的回复。不幸的是,我认为 SQLite 不支持 SUBSTRING_INDEX() 函数。这是我运行 tghe 查询时出现的结果:没有这样的函数:SUBSTRING_INDEX: update test set postcode=SUBSTRING_INDEX(address, ',', -1) AND address=replace(address,concat(',',SUBSTRING_INDEX(address, ',', -1)), '');
  • 好的,只是意识到我实际上可以将它导入谷歌表格来做到这一点。我认为谷歌表格具有拆分功能,但我不确定如何应用它...
【解决方案3】:

我得到了工作 SQLite 命令来获得所需的任务,只需要执行三个查询

[1]:update West2 set postcode=(select replace(address, rtrim(address, replace(address, ',', '')), '') from West2); - 更新邮政编码列

[2]:update West2 set address=(select rtrim(address, replace(address, ',', '')) from West2); - 更新地址栏

[3]: update West2 set address=(select replace(address, substr(address, -1), '') from West2); - 从所有条目中删除最后一个 , 在地址栏中

这将完成所有必需的任务。

一切顺利:)

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2016-06-28
    • 2012-12-16
    相关资源
    最近更新 更多