我正在为 csv 文件使用 hxtt sql 驱动程序。它只支持纯 sql。有没有办法使用普通的 sql 语句来模拟组连接?
问问题
396 次
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 回答