文字列中の重複する文字を削除する

 大分あいだが空いてしまいましたが、残暑厳しいおり、皆さんお元気でしょうか。理事長のSQLパズルコーナーでございます。

 さて、今回の問題は、SQLがひっじょーに苦手とする嫌な分野、文字列操作からの出題でございます。
 次のような、適当な文字列を格納するテーブルがございます。


CREATE TABLE WordList
(word_key INTEGER NOT NULL PRIMARY KEY,
word_txt VARCHAR(25) NOT NULL);

INSERT INTO WordList VALUES (1, 'aaaaaa');
INSERT INTO WordList VALUES (2, 'abababab');
INSERT INTO WordList VALUES (3, 'abcdeaccc');
INSERT INTO WordList VALUES (4, 'abbcdeab');
INSERT INTO WordList VALUES (5, 'abcdefg');

 ここから、次のような重複する文字を全て削除した後の文字列を求めるのが、今回のお題です。出典はセルコの『Thinking in Sets』、「18.1 Removing Letters in a String」。


/* 求める結果 */
word_key word_txt
―――― ――――
1 a
2 ab
3 abcde
4 abcde
5 abcdefg

 えーぶっちゃけですね。実務で本当にこれやれと言われたら、「SQLではやらない」というのが私の回答です。こんなのテーブルのデータそっくりアプリの側に持ってくれば、一文字ずつ切り出して、自分より後ろ(右側)に自分と同じ文字があるかどうか判定して、あれば削除、なければ残し、というループ処理で一発です。こういうときこそ手続き型言語の出番です。

 おまけにSQLは文字列操作に全く熱心でない言語で、「あ、それ自分の仕事じゃないんで。お先に失礼します」という生意気な新人ばりに文字列関数が少ないため、文字列処理に不向きです。標準SQLのみで解こうとするなら、レベルは中の上。実装依存、特に正規表現を使えばもう少し簡単になるかもしれない。それでもあんまり綺麗な解法はない気がする。セルコの答えもはっきり言ってエレガントではない。

 さあ皆さん、夏休み最後の宿題です。レッツトライ。
 理事長は今から昔の同僚と飲みに行ってきます。