2016-02-12 2 views
0

У меня есть таблица с именем _id. Я использую SQLite3-запросы для получения имен с указанным идентификатором, например, следующим api.Возврат повторяющихся записей

getName(id) >> Query "select name from table where _id=id" 

и этот другой удобный API для массива идентификаторов, возвращаемые строки (имена) должны соответствовать порядку запрашиваемых идентификаторов.

getNames(ids) >> 
    /* Returned text must be ordered */ 
    var ordClause='ORDER BY CASE _id'; 
    for(var i=1;i<=ids.length;i++){ ordClause += ' WHEN '+ids[i-1]+' THEN '+i; } 
    ordClause += ' END'; 
    Query "select name from table where _id in("+ids+") "+ordClause 

Проблема возникает, когда данные ids имеют повторяющиеся значения. Резервные идентификаторы сопоставляются только с первым идентификатором. Таким образом, возвращаемые строки могут быть меньше запрошенных идентификаторов.

Как я могу решить эту проблему?

+0

Повторяющиеся идентификаторы просто раздражает. С большой БД для выполнения потребуется много времени, но я бы сбросил все данные в новую структуру таблицы с новым уникальным полем идентификатора и сохранил old_ids в качестве предварительной ссылки. Я не уверен, что это хорошая идея в вашем случае ... – SebasSBM

+0

Мой подход может быть худшим, если объем данных слишком массивный ... – SebasSBM

+0

Фактически данные слишком велики для этого решения, и избыточная ситуация очень редко, очень мало вызовов API имеют избыточные идентификаторы в случаях использования в углах. Я должен найти решение для этого особого случая. –

ответ

1

Запрос SELECT возвращает любую строку, которая соответствует фильтру в предложении WHERE. Резервные идентификаторы в наборе IN не изменяют тот факт, что одна строка соответствует этому фильтру.

Если вы действительно хотите, повторяющиеся строки, вы должны написать отдельный запрос для каждого из них:

SELECT name FROM MyTable WHERE ID = 7 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 8 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 8 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 7 
UNION ALL 
SELECT name FROM MyTable WHERE ID = 1; 
+0

correct "ORDER BY никогда не удаляет строки", но выбирает in (list_with_redundancies). Возможно, это основная причина для решения проблемы. –

+0

'IN (...)' также не удаляет соответствующие строки. –

+0

'выберите имя из таблицы, где _id в (7,8,8,7,1)' возвращает только три строки. –

Смежные вопросы