4

我正在为 csv 文件使用 hxtt sql 驱动程序。它只支持纯 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 回答