Получение записей из таблицы на основе поля фильтра и Between, но также с логикой OR для нескольких строк - PullRequest
2 голосов
/ 23 мая 2010

У меня есть эта таблица, где я храню несколько идентификаторов и возрастной диапазон (def1, def2)

CREATE TABLE "template_requirements" (
  "_id" INTEGER NOT NULL,
  "templateid" INTEGER,
  "def1" VARCHAR(255),
  "def2" VARCHAR(255),
  PRIMARY KEY("_id")
)

Имея такие значения, как:

templateid | def1 | def2
-------------------------------
100        | 7    | 25
200        | 40   | 90
300        | 7    | 25
300        | 40   | 60

Как вы видите для templateid 300, у нас есть логика или: возраст от 7 до 25 или возраст от 40 до 60.

Я хочу получить все идентификаторы шаблонов, которые не для определенного age, например, 25 ... В чем проблема?

Если я выполню запрос, подобный этому:

SELECT group_concat(templateid) 
 FROM template_requirements 
where 1=1 and '25' not between cast(def1 as integer) 
                       and cast(def2 as integer)

он возвращает 200, 300, что неверно, так как 300 соответствует строке 40–60, но не должно включаться в результат, поскольку у нас есть условие с тем же шаблоном от 7 до 25, в котором не выполняется промежуточный элемент.

Каким будет правильный запрос в SQLite, я бы хотел сохранить материал group_concat.

Ответы [ 2 ]

2 голосов
/ 23 мая 2010

Вы можете попробовать EXCEPT:

sqlite> select group_concat(templateid)
          from (select templateid from template_requirements
                except
                select templateid from template_requirements
                 where 25 between cast(def1 as integer) and cast(def2 as integer));

... покажите мне "templateid" с, за исключением тех, которые имеют возрастной диапазон 25 лет.

Или как насчет WHERE NOT IN:

sqlite> select group_concat(distinct templateid)
          from template_requirements
         where templateid not in
                 (select templateid from template_requirements
                   where 25 between cast(def1 as integer) and cast(def2 as integer));

Оба являются довольно "разговорными" представлениями SQL о том, что вы пытаетесь сделать ...

1 голос
/ 23 мая 2010

Я думаю, что это не sqlite, а запрос, попробуйте это:

SELECT templateid
FROM template_requirements 

/*You want this values*/
WHERE '25' not between cast(def1 as integer) and cast(def2 as integer)

/*You don't want results with this values (with this you should eliminate 300)*/
AND templateid NOT IN (
  SELECT templateid
  FROM template_requirements 
  WHERE '25' between cast(def1 as integer) and cast(def2 as integer)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...