2013-02-20 57 views
5

我有一个问题,也许它简单(为你的大师)。动态MySQL在哪里子句在存储过程

我正在将我的SQL Paging类从C#转移到MySQL存储过程。在我的C#自制对象中,查询是基于标准动态构建的。例如:

if(keywords is not null) 
{ 
    whereClause += "WHERE description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
    whereClause += "AND price = '%price%'" 
} 

....

string query = "SELECT col1, col2 FROM tblThreads " + whereClause 

现在,我的问题是:我该怎么做在MySQL类似这样的动态where子句?或者说,如果他们不为这些参数输入任何内容,我如何告诉MySQL在存储过程中跳过这些参数? IE:

SELECT col1, col2 FROM tblThreads 

会这样的工作,如果这些参数为空?

SELECT col1, col2 FROM tblThreads WHERE (IS NULL @keywords OR description like '%@keywords%' 

?? ??

谢谢你们。

回答

1

,如果你让他们查询整个数据库的最简单方法是只需添加一个1 = 1到您的发言喜欢的东西

whereClause = "WHERE 1 = 1" 

if(keywords is not null) 
{ 
whereClause += "AND description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
whereClause += "AND price = '%price%'" 
} 
+0

我喜欢这一张。我自己使用它,因为当我必须对SQL语句进行“重”解析时,即以编程方式移除AND子句。允许您回到前一个“AND”,并删除该行等。对WHERE子句进行折扣使得这更容易。 – 2013-02-20 15:28:13

+0

我以前见过这个,尽管它没有回答我最初的问题,但它很有趣。假设我坚持我的C#对象类,现在我试图确定我是否使用“AND”(我有一个布尔变量在我使用AND时设置为true)。假设我这样做,我会不必跟踪我何时使用我的第一个参数,对吗?这是否有任何表现处罚,并且1 = 1是否会导致任何问题? – 2013-02-20 16:42:40

+0

只是看了一些额外的细节:http://stackoverflow.com/questions/8149142/where-1-1-statement 我其实很喜欢这个想法,并会尝试实施它。谢谢你的提示!如果我决定追求这条道路,我也可以使用这种方法最终构建我的存储过程。多谢你们。 – 2013-02-20 16:49:13

2

您可以使用CASE语句来检查的@keywords的值,例如。

SELECT col1, col2 
FROM tblThreads 
WHERE description LIKE CASE WHEN @keywords IS NULL 
          THEN description 
          ELSE CONCAT('%', @keywords, '%') 
          END 
     AND 
     price LIKE CASE WHEN @price IS NULL 
          THEN price 
          ELSE CONCAT('%', @price, '%') 
          END 
+0

如果所有参数都为空,会发生什么?这不会导致执行不力吗? IE:description LIKE'%%'AND price LIKE'%%'AND param3 LIKE'%%'AND ... paramX LIKE'%%'? – 2013-02-20 16:41:18

+0

忽略我最近的评论。如果我做1 = 1的方法,然后插入一个案例语句后字 'CASE WHEN @price <> NULL THEN AND price LIKE'%price%'' 应该工作我猜... ...'我从来没有尝试过,所以这是猜测。 – 2013-02-20 16:51:16

0
SELECT col1, col2 
FROM tblThreads 
WHERE case when @keywords is not null then description like '%' + @keywords + '%' when @price is not null then price like'%' + @price + '%' end