2008-12-01 3 views
3

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

SELECT * FROM film 
WHERE day LIKE '%day%' 
AND month LIKE '%month%' 
AND year LIKE '%year%' 

что-то вроде

function queryData(year,month,day) 

declare Y 

if year == nothing 
    Y = '%' 
else 
    Y = '%' + year + '%' 

declare M 

if month == nothing 
    M = '%' 
else 
    M = '%' + month + '%' 

declare D 

if day == nothing 
    D = '%' 
else 
    D = '%' + day + '%' 

return result of : 

SELECT * FROM film 
WHERE day LIKE D 
OR month LIKE M 
OR year LIKE Y 

ответ

0
SELECT * FROM film 
WHERE day LIKE '%day%' 
OR month LIKE '%month%' 
OR year LIKE '%year%' 

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

+0

Но это не даст результатов. день = «01» и месяц = ​​«Ян» доставит вам 1-го января 1-го февраля и т. Д. Плюс все дни в январе – 2008-12-01 13:04:30

0

Использование OR вместо AND изменяет логику запроса. Он не делает параметры необязательными. Способ использования не использует параметры, которые вы не используете. Я не знаю другого пути.

0

Я бы значение по умолчанию для каждого параметра%, когда кто-то заполнит параметр, я передам% значение%

1

Почему вы не создадите свой запрос динамически? В зависимости от параметров вы добавляете фильтры динамически.

.: например

string query = "SELECT * FROM film"; 
string paramenters = string.empty; 

if(day!= string.empty) 
    parameters = " Where day LIKE '%day%'"; 

if(month != string.empty) 
{ 
    if(parameters != string.empty) 
    parameters += "AND month LIKE '%month%'"; 
    else 
    parameters = "WHERE month LIKE '%month%'"; 
} 

и так далее ....

В этом случае вы не получите дополнительные результаты, которые вы получите с OR.

0

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

day = "" 
month = "dec" 
year = "2008" 

сделает запрос:

SELECT * FROM film 
WHERE day LIKE '%%' 
AND month LIKE '%dec%' 
AND year LIKE '%2008%' 

'%%' должен соответствовать любой строке, пока это не NULL.

0

спасибо за помощь людям, я закончил реализацию следующего. работает лакомство

if year == nothing 
    Y = '' 
else 
    Y = '%' + year + '%' 
0

Если вы хотите для нединамического запроса, что-то, как это будет работать:

SELECT * FROM film 
WHERE (:daysearch is null or day LIKE :daysearch) 
AND (:monthsearch is null or month LIKE :monthsearch) 
AND (:yearsearch is null or year LIKE :yearsearch) 

Хотя, мне интересно, если есть падение производительности в базе данных.

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