在mysql查询中分隔行

时间:2013-12-26 13:07:08

标签: mysql substring

我有一个mysql数据库,其中几个URL保存在一个字段中(见下文)。我现在需要将这些URL分开以将它们插入到新数据库中,其中每个URL都有自己的ID /行。

不幸的是,到目前为止,我只是将第一个URL与使用Substring的其他URL分开,并且无法获得以下URL。

这是一个这样一个领域的例子:

www.1234.com
www.435346.com
www.35345567.org
www.9380.net
...etc.

因此字段中可以有不同数量的URL。

我可以通过以下方式获得第一个:

INSERT INTO url (url)
SELECT DISTINCT SUBSTRING_INDEX(old_url_field, 'www', 2)
FROM old_table

但我不知道如何获得所有其他人。

提前感谢您的帮助。

修改

PaparazzoKid的解决方案为我做了一些改变。

我只需要进行一些更改,因为我的情况下的URL不是用空格分隔,而是用换行符[CHAR(10)]分隔,但是它完美无缺,你可以在这里找到我的解决方案

http://sqlfiddle.com/#!2/88b882/2

或直接在下面的代码:

CREATE TABLE tablename (
  id INT,
  name VARCHAR(80));

INSERT INTO tablename VALUES
(1, 'www.mysite.com
www.anothersite.com
www.siteone.com'),
(2, 'www.sitetwo.net');

我修改过的SQL代码:

SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, CHAR(10), numbers.n), CHAR(10), -1) url
FROM
  (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
  UNION ALL SELECT 5 UNION ALL SELECT 6) numbers INNER JOIN tablename
  ON CHAR_LENGTH(REPLACE(tablename.name,CHAR(10), '  '))
     -CHAR_LENGTH(tablename.name)>=numbers.n-1
ORDER BY
  n 

1 个答案:

答案 0 :(得分:2)

这可能会让你朝着正确的方向前进:

使用此临时数据:

CREATE TABLE oldTable (
  id INT,
  url VARCHAR(80));

INSERT INTO oldTable VALUES
(1, 'www.mysite.com www.anothersite.com www.siteone.com'),
(2, 'www.sitetwo.net');

CREATE TABLE newTable (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  oldID INT,
  url VARCHAR(100));

此查询有效:

INSERT INTO newTable (oldID, url) 
    SELECT
      oldTable.id,
      SUBSTRING_INDEX(SUBSTRING_INDEX(oldTable.url, ' ', numbers.n), ' ', -1) url
    FROM
      (SELECT 1 n UNION ALL SELECT 2
       UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN oldTable
      ON CHAR_LENGTH(oldTable.url)
         -CHAR_LENGTH(REPLACE(oldTable.url, ' ', ''))>=numbers.n-1
    ORDER BY
      id, n

<强>结果:

SELECT * FROM newTable

id  | oldID | URL
----|-----------------------
1   | 1     | www.mysite.com
2   | 1     | www.anothersite.com
3   | 1     | www.siteone.com
4   | 2     | www.sitetwo.net

See the SQLFIDDLE demo here