我有一个充满电子邮件的数据库。它包含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)
谢谢!
答案 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列中,则将从每个部分中删除任何尾随空格。