今天我会根据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参数。
抱歉我的英文。
非常感谢。
答案 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。