我正在使用以下查询,但我目前必须在每个参数中输入一个值才能使查询生效。有没有办法使参数可选,这样一个或多个值将返回结果?
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 :(得分:1)
为什么不动态创建查询? 根据您拥有的参数,动态附加过滤器。
e.g:
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
获得的额外结果。
答案 1 :(得分:0)
SELECT * FROM film
WHERE day LIKE '%day%'
OR month LIKE '%month%'
OR year LIKE '%year%'
您仍将提供所有三个参数,但如果它们为空或NULL则无关紧要,匹配仍将从非空白的那些返回。
答案 2 :(得分:0)
使用OR而不是AND更改查询的逻辑。它不会使参数成为可选参数。要走的路不是使用你没有使用的参数。我不知道其他任何方式。
答案 3 :(得分:0)
我会将每个参数的默认值设为%,当有人填写参数时,我会传递%value%
答案 4 :(得分:0)
我没有测试过,但只要你确保未使用的参数是空字符串,你的查询看起来就应该有效。 e.g。
day = ""
month = "dec"
year = "2008"
会进行查询:
SELECT * FROM film
WHERE day LIKE '%%'
AND month LIKE '%dec%'
AND year LIKE '%2008%'
'%%'
应匹配任何字符串,只要它不是NULL。
答案 5 :(得分:0)
感谢您的帮助,我结束了以下的实施。是一种享受
if year == nothing
Y = ''
else
Y = '%' + year + '%'
答案 6 :(得分: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)
虽然,我确实想知道数据库是否有性能损失。