2012-02-27 14 views
4

私はcsvファイルにhxtt sqlドライバを使用しています。プレーンSQLのみをサポートしています。単純なSQL文を使用してグループ連結をシミュレートする方法はありますか?プレーンSQLでgroup_concatをシミュレートする方法

+0

HXTTのウェブサイトによると、彼らはcsvファイルで 'GROUP_CONCAT'をサポートしています。ここをクリックしてください:http://www.hxtt.com/text.html –

+0

私はバージョン3を使用しています。バージョン3がサポートしているかどうかわかりません。しかし、私はそれを使用しようとし、エラーが発生しました。 – Luke101

+0

私はアップグレードが問題外だと思いますか? –

答えて

3

どのようにプレーンテキストですか?トリガーを使用することができれば、それをかなり簡単に行うことができます。私は値を連結する順序を指定できるgroup_concat()が必要なときにSQLite3でこのトリックを使用しました(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の条件文を実行するすべての方法の間に、あなたはTuring完全なシステムを持っています。しかし、トリガーやプロシージャー拡張がない場合、ジェネレーター・テーブルはありません。

私はhxttについて何も知らないので、おそらくこれはあなたを助けません。しかし、SQLite3はCSVを扱うことができるので、おそらくSQLite3はあなたを助けることができます。

関連する問題