Hi,

I manage range in a database:
CREATE TABLE range(level     INTEGER,
                   roomIdMin INTEGER,
                   roomIdMax INTEGER,
                   CHECK (roomIdMin<=roomIdMax) );
INSERT INTO range VALUES (1,100,200);
INSERT INTO range VALUES (2,300,400);

|      level |  roomIdMin |  roomIdMax |
+------------+------------+------------+
|          1 |        100 |        200 |
|          2 |        300 |        400 |


I manage range insertion through a Trigger to have automatique range merging
(if level are =). For instance :

INSERT INTO range VALUES (1,150,250);

|      level |  roomIdMin |  roomIdMax |
+------------+------------+------------+
|          1 |        100 |        250 |
|          2 |        300 |        400 |

Idem for all insertion case...



For range deletion, I would like to do be able to delete for instance
[150,200] and get:
|      level |  roomIdMin |  roomIdMax |
+------------+------------+------------+
|          1 |        100 |        149 |
|          1 |        201 |        250 |
|          2 |        300 |        400 |

So I cannot use Trigger because range [150,200]  is not an entry in range
table.

So I write a "generic" TRANSACTION where I process all deletation case but I
have a SQL syntaxe problem with one case (the "split" case):
If I have in my database:

|      level |  roomIdMin |  roomIdMax |
+------------+------------+------------+
|          1 |        100 |        400 |

And I delete [200,300], I would like to have
|      level |  roomIdMin |  roomIdMax |
+------------+------------+------------+
|          1 |        100 |        199 |
|          1 |        301 |        400 |

SO I can:
Case 1:
- delete [100,400]
- insert [100,199]
- insert [301,400]
Case 2:
- Update [100,400] to [100,199]
- insert [301,400]


So I would like to write something like that:
CASE WHEN
  EXISTS( SELECT @max=suid_max, @min=roomIdMin FROM range
            WHERE 200 BETWEEN roomIdMin AND roomIdMax
              AND 400 BETWEEN roomIdMin AND roomIdMax)
THEN
  DELETE FROM range WHERE roomidm...@min AND roomidm...@max;
  INSERT INTO range VALUES (1, @min, 199  );
  INSERT INTO range VALUES (1, 301 , @max );
END

or

CASE WHEN
  EXISTS( SELECT @max=suid_max, @min=roomIdMin FROM range
            WHERE 200 BETWEEN roomIdMin AND roomIdMax
              AND 400 BETWEEN roomIdMin AND roomIdMax)
THEN
  UPDATE range SET roomIdMax=199 WHERE roomidm...@min AND roomidm...@max;
  INSERT INTO range VALUES (1, 301 , @max );
END

But SQLite generate a syntaxe error... Because I think we cannot use CASE
WHEN THEN END outside and instruction...
I tried lots of syntax without success...

How can I write that in SQL for SQLite?

Regards,

Sylvain
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to