0

メールでいっぱいのデータベースがあります。to、from、subject、body などが列として含まれています。基本的に同じ形式で出力しようとしていますが、出力ファイルを使用するアプリケーションの場合、本文テキストは約 300 文字を超えることはできません。すべてのテキストが必要なので、最初の 300 文字だけを取得したくはありません。私がやりたいのは、メール本文が 900 文字の場合、それぞれがメッセージの 3 分の 1 を含む 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

そのクエリは、最大 10n.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 の偶数倍の場合、「余分な」空のピースが返される、まれなケースがあります。醜い修正の 1 つは、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)

また、式の結果を VARCHAR 列に格納するとbodypart、末尾のスペースが各部分から削除されることに注意してください。

于 2013-02-05T23:15:25.737 に答える