0

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

即)我有这个:

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)

谢谢!

4

1 回答 1

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 列中,则将从每个部分中删除任何尾随空格。

于 2013-02-05T23:15:25.737 回答