4

csvファイルにhxttsqlドライバーを使用しています。プレーンSQLのみをサポートします。プレーンSQLステートメントを使用してグループ連結をシミュレートする方法はありますか?

4

1 に答える 1

3

どれほどわかりやすいですか?トリガーを使用できる場合は、かなり簡単に実行できます。以前、SQLite3で値を連結する順序を指定できるgroup_concat()が必要なときに、このトリックを使用しました(SQLite3にはその方法がありません)。

したがって、次のようなテーブルがあるとしましょう。

CREATE TABLE t(v TEXT NOT NULL, num INTEGER NOT NULL UNIQUE);

そして、num順に並べられたvの値を、いくつかの区切り文字、たとえばコンマで連結したいとします。

CREATE TEMP TABLE c(v TEXT);
CREATE TEMP TABLE j(v TEXT);

CREATE TEMP TRIGGER j_ins BEFORE INSERT ON j
FOR EACH ROW
BEGIN
    UPDATE c SET v = v || ',' || NEW.v;
    INSERT INTO c (v) SELECT NEW.v WHERE NOT EXISTS (SELECT * FROM c);
    SELECT RAISE(IGNORE);
END;

今、私たちはできる:

INSERT INTO j (c) SELECT v FROM t ORDER BY num;
SELECT v FROM c; -- this should output the concatenation of the values of v in t
DELETE FROM c;

最後に、これはこれが機能することを示すsqlite3セッションです。

SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE t(v TEXT NOT NULL, num INTEGER NOT NULL UNIQUE);
sqlite> CREATE TEMP TABLE c(v TEXT);
sqlite> CREATE TEMP TABLE j(v TEXT);
sqlite> CREATE TEMP TRIGGER j_ins BEFORE INSERT ON j
   ...> FOR EACH ROW
   ...> BEGIN
   ...>     UPDATE c SET v = v || ',' || NEW.v;
   ...>     INSERT INTO c (v) SELECT NEW.v WHERE NOT EXISTS (SELECT * FROM c);
   ...>     SELECT RAISE(IGNORE);
   ...> END;
sqlite> insert into t (v, num) values (1, 0);
sqlite> insert into t (v, num) values (31, 1);
sqlite> insert into t (v, num) values (52, 2);
sqlite> insert into t (v, num) values (0, 3);
sqlite> SELECT v FROM c;
sqlite> INSERT INTO j (v) SELECT v FROM t ORDER BY num;
sqlite> SELECT v FROM c;
1,31,52,0
sqlite> SELECT v FROM j;
sqlite> DELETE FROM c;
sqlite> 

トリガーに依存するため、これは純粋なSQLではありません。再帰的トリガーとSQLで条件を実行するすべての方法の間に、チューリング完全システムがあります。ただし、トリガーや手続き型拡張機能がない場合は、ジェネレーターテーブルはありません...それほど多くはありません。

私はhxttについて何も知らないので、多分これはあなたを助けないでしょう。しかし、SQLite3はCSVを処理できるので、SQLite3が役立つかもしれません...

于 2012-03-02T05:29:53.353 に答える