2016-09-15 2 views
2

Сегодня я спрошу простой (возможно, почти глупый вопрос) в соответствии с предложениями SQL.SQL с переменными условиями

Я имею дело с запросами SELECT, где у меня есть некоторые условия, но не всегда все из них. Я объясню пример.

Представьте простую таблицу Person [идентификатор, имя, фамилию]

Я хочу, чтобы получить идентификатор лица ... Я всегда буду просить имя, но не всегда прошу фамилии, поэтому запрос будет зависеть от параметров функции 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"; } 

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

Извините за мой английский.

Большое спасибо.

+1

'... name = $ name и ($ фамилия IS NULL или surname = $ surname)'. – jarlh

+2

Лучшее решение состоит в том, чтобы использовать подготовленные заявления и код, отрезанный от @jarlh – Jens

ответ

0

Вы можете захотеть разбить запрос и конкатенации:

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

Лучшее решение, которое я могу предоставить это:

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

Я только что увидел, что @jarlh разместил то же самое, что и комментарий. –

0

Спасибо за вопрос! Это очень распространенная ситуация, и ответ Санзиба является наиболее распространенным ответом. Имейте в виду, однако, что вы измельчите свой драгоценный sql, и в будущем вам нужно будет прикрепить отладчик и уловить ваш sql на лету, чтобы узнать, какой запрос на самом деле наносит вам удар.

Лучший подход, чтобы сделать все это в SQL, как следует ...

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

читаемость вашего запроса сохраняется. ОПЦИЯ (RECOMPILE) может быть переполнена в этой ситуации, но рекомендуется для дополнительных параметров, поскольку она позволяет оптимизировать db для конкретной комбинации параметров.

Лучшим вариантом было бы вставить указанный выше запрос в шаблон QueryFirst .sql и удалить все искушения от неотъемлемого касания вашего SQL! Среди многих вещей, с которыми поможет QueryFirst, он автоматически преобразует null в ваш C# в DBNull.Value, следовательно, NULL в вашем SQL.

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