【问题标题】:Split MYSQL column into multiple columns将 MYSQL 列拆分为多列
【发布时间】:2017-05-20 17:30:44
【问题描述】:

我在 mysql 数据库中有几百万条记录,其中包含以下列: company, address, url, phone, category

这是一个示例行: Company123 - 123 Candyland St, New York, NY 12345 - http://urltothiscompany.com - 123-456-7890 - Bakery

我的问题是关于地址栏的。我想将这些行分成单独的地址、城市、州和邮政编码列: 123 Candyland St - New York - NY - 12345

但是,有些行没有街道,只有城市、州和邮政编码: New York, NY, 1235

有没有办法在 mysql 中做到这一点?我不确定从哪里开始,因为有些行没有地址。也许从列的末尾开始计算字符?

感谢任何帮助。谢谢。

【问题讨论】:

  • 我会使用你的逗号作为分隔符,并从字符串的末尾倒数。第一部分是邮编,接下来是州、城市和街道(如果存在)。阅读:stackoverflow.com/questions/2696884/…
  • 我的方法是编写一个 PHP 脚本来抓取该列并在 ` - ` 上使用 PHP 的explode 函数您也可以使用isnumeric($zip) 来确保其有效,或者至少对来自加拿大的不同美国
  • 如果您确定只有街道可能不存在,那么 CodeGodie 提出的解决方案是正确的。但是,如果其他字段也可能不存在,我怀疑您需要某种验证...
  • 在您的示例中:第一个不带逗号 (... NY 12345) 第二个带逗号 (..., NY , 1235) 这很难进行数据切割

标签: php mysql


【解决方案1】:

假设您的数据实际上如下所示:

addr
=======================
street, City, State ZIP

这里是 SQL:

SELECT addr,
  substr(addr, 1, length(addr) - length(substring_index(addr, ',', -2))) street,
  substring_index(substring_index(addr, ',', -2), ',', 1) city,
  substr(trim(substring_index(addr, ',', -1)),1,2) state,
  substring_index(addr, ' ', -1) zip
FROM tab

哎呀,street 有一个额外的逗号,这是你要修复的作业:)

【讨论】:

  • 抱歉耽搁了,很好的回答!
  • 请问这是什么GUI软件/IDE?
  • topnew.net/sidu - 用于 MySQL、PostgreSQL、SQLite 等的 SIDU DB GUI
【解决方案2】:

像我这样的谷歌用户的快速回答。
将列拆分为 3 列的示例。如果您需要 2 列,请在请求中省略 new_column_name_2
适用于 100x200x300 等尺寸变为 100 200 300

  1. 创建新列。
ALTER TABLE `your_table_name` ADD `new_column_name_1` VARCHAR(250) DEFAULT '';
ALTER TABLE `your_table_name` ADD `new_column_name_2` VARCHAR(250) DEFAULT '';
ALTER TABLE `your_table_name` ADD `new_column_name_3` VARCHAR(250) DEFAULT '';
  1. 验证您选择的内容正确
SELECT `old_column_name`,
SUBSTRING_INDEX(`old_column_name`, 'x', 1) `new_column_name_1`,
SUBSTRING_INDEX(SUBSTRING_INDEX(`old_column_name`, 'x', 2),'x',-1) `new_column_name_2`, 
SUBSTRING_INDEX(`old_column_name`, 'x', -1) `new_column_name_3`
FROM `your_table_name`;
  1. 填充新列
UPDATE `your_table_name` SET
`new_column_name_1` = SUBSTRING_INDEX(`old_column_name`, 'x', 1),
`new_column_name_2` = SUBSTRING_INDEX(SUBSTRING_INDEX(`old_column_name`, 'x', 2),'x',-1),
`new_column_name_3` = SUBSTRING_INDEX(`old_column_name`, 'x', -1);

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2021-01-24
    • 2013-07-12
    • 2013-01-23
    • 2022-01-03
    相关资源
    最近更新 更多