具有可变条件的SQL

时间:2016-09-15 09:17:24

标签: mysql sql database select

今天我会根据SQL句子提出一个简单(可能几乎是愚蠢的问题)。

我正在处理SELECT查询,其中我有一些条件,但也不是所有条件。我将用一个例子来解释。

想象一下一个简单的表人[id,name,surname]

我想得到一个人的id ...我会一直询问这个名字,但并不总是要求姓氏,所以查询将取决于php函数的参数...查询可能是:

SELECT id FROM Person where name = $name; (if parameter surname = null)

SELECT id FROM Person where name = $name and surname = $surname;(如果定义了参数姓氏)

我有两个可靠的代码来获取它,但我认为它没有优化

选项1:

if ($surname) {
    SELECT id FROM Person where name = $name and surname = $surname;
else{
    SELECT id FROM Person where name = $name;
}

选项2:

$sql = "SELECT id FROM Person where name = $name";
if ($surname) { $sql = $sql + " and surname = $surname"; }

我认为最好的选择是第二个选项,而参数可能会增加,但我不知道它是否可以在查询中引入的灵活参数取决于null参数。

抱歉我的英文。

非常感谢。

3 个答案:

答案 0 :(得分:0)

您可能想要拆分查询并连接:

$sql="SELECT * FROM Person WHERE 1=1";
if(isset($name))
{
       $sql.= " AND name='$name'";    
}
if(isset($surname))
{
       $sql.= " AND surname='$surname'";    
}

答案 1 :(得分:0)

我能提供的最佳解决方案是:

$sql = "SELECT id FROM Person WHERE name = $name and ($surname IS NULL or surname = $surname)";

答案 2 :(得分:0)

感谢您的提问!这是一种非常常见的情况,Sanzeeb的回答是最常见的回答。但是请注意,你正在砍掉你宝贵的sql,将来你需要附加一个调试器并动态捕获你的sql以查看实际命中你的数据库的请求。

更好的方法是在sql中完成所有操作,如下所示......

var sql = @"
SELECT id FROM Person where name = $name
AND ( surname = $surname or $surname is null)
OPTION(RECOMPILE)
";

保持您的请求的可读性。在这种情况下,OPTION(RECOMPILE)可能过度,但建议用于可选参数,因为它允许db针对所提供的特定参数组合进行优化。

更好的选择是将上述请求粘贴到QueryFirst .sql模板中,并删除无法触及SQL的所有诱惑!在QueryFirst将帮助的许多事情中,它会自动将C#中的null转换为DBNull.Value,因此SQL中为NULL。