SQL ГДЕ В (...) сортировать по порядку списка? - PullRequest
4 голосов
/ 01 февраля 2011

Допустим, у меня есть запрос к базе данных с предложением where

WHERE _id IN (5,6,424,2)

Есть ли способ сортировки возвращаемого курсора в том порядке, в котором _id указан в списке?Атрибут _id от первого до последнего в Cursor имеет значение 5, 6, 424, 2?

Это происходит на Android через ContentProvider, но это, вероятно, не имеет значения.

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

Выберите список идентификаторов, используя подзапрос, и присоединитесь к нему:


select t1.*
from t1
inner join
(
  select 1 as id, 1 as num
  union all select 5, 2
  union all select 3, 3
) ids on t1.id = ids.id
order by ids.num

UPD: Код исправлен

1 голос
/ 01 февраля 2011

Список? У вас нет списка! ;)

Это:

WHERE _id IN (5,6,424,2)

- это просто синтаксический сахар для этого:

WHERE (
       _id  = 5
       OR _id = 6
       OR _id = 424
       OR _id = 2
      )

SQL имеет только одну структуру данных, являющуюся таблицей. Ваш (5,6,424,2) тоже не стол! :)

Вы можете создать таблицу значений, но ваша следующая проблема заключается в том, что таблицы не имеют логического порядка. Следовательно, согласно ответу @ cyberkiwi, вам нужно явно создать столбец для моделирования порядка сортировки. И чтобы сделать это явным для вызывающего приложения, убедитесь, что вы выставили этот столбец в предложении SELECT вашего запроса.

1 голос
/ 01 февраля 2011

Вы можете присоединить его к виртуальной таблице, содержащей список, необходимый в порядке сортировки

select tbl.*
from tbl
inner join (
    select 1 as sorter, 5 as value union all
    select 2, 6 union all
    select 3, 424 union all
    select 4, 2) X on tbl._id = X.value
ORDER BY X.sorter
1 голос
/ 01 февраля 2011

... порядок в
случае, когда _id = 5, затем 1
, когда _id = 6, затем 2
end

и т.д.

1 голос
/ 01 февраля 2011

Один из подходов может заключаться в том, чтобы выполнять отдельные SQL-запросы с UNION между ними. Очевидно, что вы выполняете каждый запрос в том порядке, в котором вы хотели бы получить его.

...