Как создать оператор SQL для поиска множественных элементов, в котором все параметры являются необязательными? - PullRequest
4 голосов
/ 20 декабря 2011

Я хотел бы знать, есть ли какой-нибудь умный способ сделать оператор SQL для поисковой системы, где есть 5 необязательных параметров. Все параметры могут быть использованы или только один из них, или сочетание любого из них. Это составляет до 3000+ различных комбинаций.

Необходимо подготовить оператор, чтобы избежать SQL-инъекций.

Я посмотрел эту запись, но она совсем не вырезана.

Я ищу что-то вроде

Строка sql = SELECT * ИЗ таблицы WHERE (необязательно1) =? И (необязательно2) =? И (необязательно3) =? И (необязательно4) =? И (необязательно5) =?

prepare.setString (1, необязательно1) и так далее ...

Ответы [ 3 ]

3 голосов
/ 20 декабря 2011

Я считаю, что это должно работать (хотя не проверял)

SELECT * FROM table 
WHERE 
field1 = CASE
WHEN ? IS NULL THEN field1
ELSE ? 
END  AND
field2 = CASE
WHEN ? IS NULL THEN field2
ELSE ? 
END  AND .... etc

//java code
if ([optional1 is required]) 
{
  prepared.setString(1, optional1) ;
  prepared.setString(2, optional1) ;
}
else
{
    prepared.setNull(1, java.sql.Types.VARCHAR) ;
    prepared.setNull(2, java.sql.Types.VARCHAR) ;
}

и т. Д.

3 голосов
/ 20 декабря 2011

Используйте свой Java-код, чтобы добавить опции к предложению where в зависимости от наличия ваших аргументов (их длины или существования, в зависимости от того, что именно).Таким образом, если необязательный параметр не нужен, он даже не будет частью вашего выражения SQL.Простой.

2 голосов
/ 20 декабря 2011

@ a1ex07 дал ответ для выполнения этого в виде одного запроса.Использование NULL и проверка их в каждом условии.

WHERE
  table.x = CASE WHEN @x IS NULL THEN table.x ELSE @x END

или ...

WHERE
  (@x IS NULL OR table.x = @x)

или ...

WHERE
  table.x = COALESCE(@x, table.x)

и т. Д. И т. Д.

Однако есть одно предупреждение;Как бы удобно ни было сделать один запрос для выполнения всего этого, Все из этих ответов являются неоптимальными.Часто они утомительны.

Когда вы пишете ОДИН запрос, создается только ОДИН план выполнения.И этот ОДИН план выполнения должен подходить для ВСЕХ возможных комбинаций значений.Но это исправляет, какие индексы ищутся, какой порядок их поиска и т. Д. Это дает наименее наихудший план для запроса «один размер подходит для всех».

Вместо этого лучше добавлять условия какнеобходимо.Вы по-прежнему параметризуете их, но не включаете условие, если знаете, что параметр имеет значение NULL.

Это хорошая ссылка, объясняющая это далее, она предназначена специально для MS SQL Server, но обычно применима к любой СУБД, котораякэширует планы после компиляции SQL.

http://www.sommarskog.se/dyn-search.html

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