MySQL неверный вывод с предложением IN и параметром - PullRequest
5 голосов
/ 07 декабря 2011

У меня проблемы с запросом в MySQL.

Я работаю с Delphi XE и отправляю запрос с некоторым параметром в MySQL.Вот пример для запроса:

SELECT * FROM users u WHERE u.id IN (:idUsers);

: ': idUsers' - это переменная, которая получит параметр, который я отправляю с Delphi, - это строка, содержащая такой формат, например: 1,2,3

Проблема в том, что с этой строкой я получаю только первого пользователя (id = 1).Из того, что я вижу, MySQL добавляет некоторую кавычку ('') в начале и в конце строки, которую я отправляю, например, «1,2,3» вместо 1,2,3.Я пробовал этот выбор:

SELECT * FROM users u WHERE u.id IN ('1,2,3'); 

, и он действительно возвращает только первого пользователя ..

У меня была функция в MSSQL, которая разделяла отправленную мной строку и возвращала временнуютаблицу, но мы недавно перешли на MySQL, и из того, что я прочитал, MySQL не позволяет возвращать таблицу.

Кто-нибудь знает, как решить эту проблему?Я искал ответ в Интернете и не нашел ответа на эту конкретную проблему.

Спасибо за помощь.

Ответы [ 2 ]

10 голосов
/ 07 декабря 2011

Параметры не работают так; они не представляют, что вы пытаетесь предоставить список значений через запятую. Если вы установите ParamByName('WhatEver').AsString или Value, он думает, что вы имеете в виду строку в кавычках, которая содержит все, что принадлежит этому параметру. Таким образом, он делает именно то, что кажется - он пропускает IN ('1, 2, 3') вместо намеченного IN (1, 2, 3).

Вам нужно либо вернуться к самому анализу и использовать временную таблицу, либо динамически создать предложение WHERE и объединить его перед выполнением запроса. (На самом деле, вы могли бы построить запрос динамически, создав новый параметр для каждого из элементов в предложении IN, а затем выполнить цикл и назначить значения каждому из этих динамически создаваемых параметров, но это очень уродливо и очень быстро.)

0 голосов
/ 08 декабря 2011

Если у вас есть переменное число параметров в предложении IN, вы можете построить временную таблицу в MYSQL (которая содержит только столбец с именем ID), загрузить значения параметров во временную таблицу и затем сделать что-то вроде этого:

SELECT * FROM users u WHERE u.id IN (SELECT ID FROM TEMPTABLE); 

Пока TEMPTABLE содержит только те значения, которые вы хотите запросить, сканирование табличного пространства приемлемо.

После этого вы можете иметь переменное число значений.Вы также можете сделать таблицу постоянной и сохранить параметры.Добавьте столбец для пользователя, и каждый пользователь может сохранить свои индивидуальные параметры.

...