sqlite сортировка по ГДЕ в первую очередь - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь отсортировать некоторые данные в своем приложении для Android с помощью sqlite с запросом

cursor c = db.query(TABLE_NAME, null, DRILL_TYPE + " IN ('type 1', 'type 2');", null, null, null, SIZE + " ASC", null);

Я ожидаю, что результаты будут отсортированы по размеру, независимо от того, является ли детали типом 1или 2, но я сортирую все типы 1, а затем сортирую все типы 2.Что не так с моим запросом, который приводит к этому?

expected:
type 1     1
type 2     2
type 1     3
type 2     4
type 1     5
type 2     6

actual result:
type 1     1
type 1     3
type 1     5
type 2     2
type 2     4
type 2     6

Изменить, после того, как на исходный вопрос был дан ответ: -

удаление точки с запятой в конце части заказа исправило вещи, когда я используюIN, но не когда я использую NOT IN

1 Ответ

0 голосов
/ 14 февраля 2019

Я полагаю, что проблема может быть связана с точкой с запятой ; в конце предложения IN.Это фактически отметит конец SQL и, как следствие, приведет к тому, что предложение ORDER будет проигнорировано / пропущено.

То есть try: -

cursor c = db.query(TABLE_NAME, null, DRILL_TYPE + " IN ('type 1', 'type 2')", null, null, null, SIZE + " ASC", null);

В отношении: -

удаление точки с запятой в конце части заказа исправляло вещи, когда я использую IN, но не когда я использую NOT IN

Использование

 cursor c = db.query(TABLE_NAME, null, DRILL_TYPE + " NOT IN ('type 1', 'type 2')", null, null, null, SIZE + " ASC", null);

будетСортируйте строки, которые не имеют тип 1 или тип 2 , правильно, рассмотрите следующее (что копирует вашу ситуацию, но с дополнительными данными, чтобы показать результаты NOT IN): -

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (drill_type TEXT, size INTEGER);
INSERT INTO mytable VALUES
('type 2',4),('type 1',5),('type 2',6),
    ('type 1',1),('type 2',2),('type 1',3),
    ('type 4',14),('type 3',15),('type 4',16),
    ('type 3',11),('type 4',12),('type 3',13)
;

SELECT * FROM mytable WHERE drill_type IN ('type 1','type 2') ORDER BY size ASC;
SELECT * FROM mytable WHERE drill_type NOT IN ('type 1','type 2') ORDER BY size ASC;
SELECT * FROM mytable WHERE drill_type NOT IN ('type 1','type 2'); ORDER BY size ASC; -- will not sort as expected
  • Обратите внимание, что приведенное выше эффективно копирует ваш код

В результате получится: -

  1. оригинальное решение

enter image description here

, используя NOT IN правильно

enter image description here

оставляя точку с запятой в

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...