将VARCHAR字段拆分为2行MySQL

时间:2013-02-05 22:40:18

标签: mysql text chunking

我有一个充满电子邮件的数据库。它包含to,from,subject,body等作为列。我试图输出基本相同的格式,但对于我将使用输出文件的应用程序,正文文本不能超过约300个字符。我不想只抓住前300个字符,因为我需要所有的文字。我想要做的是将文本分块,如果一个电子邮件正文,900字符,返回3个单独的行,每行包含消息的三分之一,并且所有行都包含to,from,subject等信息。

即。)我有这个:

sender1      recipient1       subject1       body1(600 characters)
sender2      recipient2       subject2       body2(150 characters)

我想要这个:

sender1     recipient1        subject1       body1(first 300 characters)
sender1     recipient1        subject1       body1(next 300 characters)
sender2     recipient2        subject2       body2(150 characters)

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是一种方法示例:

SELECT p.i, SUBSTR(e.body,p.i*n.len+1,n.len) AS bodypart
  FROM ( SELECT 'abcdefghijklmnopqrstuvwxyz' AS body
       ) e
 CROSS
  JOIN ( SELECT 10 AS len
       ) n
  JOIN ( SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
                       UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
                       UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
       ) p
    ON p.i <= LENGTH(e.body) DIV n.len

该查询最多可拆分十(10)个部分,最长可达n.len个字符。

要获得长度不超过300个字符的部分,请将文字10更改为300,或更改所需的最大尺寸。要获得更多返回的零件,您可以将别名的内联视图修改为p,以返回一组整数0到您需要的最大零件数。为了让这个针对您的表运行,您可以将包含e列的表格替换为body别名的内联视图,并返回所需的其他列。

这样的事情:

SELECT e.sender
     , e.recipient
     , e.subject
     , SUBSTR(e.body,p.i*n.len+1,n.len) AS bodypart
     , p.i AS bodypart_number
  FROM myemailtable e
 CROSS
  JOIN ( SELECT 300 AS len
       ) n
  JOIN ( SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
                       UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
                       UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
       ) p
    ON p.i <= LENGTH(e.body) DIV n.len

更新

该查询有一个极端情况,当LENGTH(e.body)是n.len的偶数倍时,它将返回一个“额外”空片。一个丑陋的解决方法是更改​​ON子句中的谓词:

    ON p.i < LENGTH(e.body) DIV n.len 
    OR (p.i = LENGTH(e.body) DIV n.len AND LENGTH(e.body) MOD n.len > 0)

另请注意,如果将bodypart表达式的结果存储在VARCHAR列中,则将从每个部分中删除任何尾随空格。