这是一种方法的示例:
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 列中,则将从每个部分中删除任何尾随空格。