NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru

Как реализовать SELECT запрос с множеством комбинаций WHERE AND?

Есть БД на MSSQL, в ней таблица MyTable с кучей столбцов, "name", "class", "type", например.

Есть хранимка с множеством параметров. Например, "name", "class", "type"
все параметры могут быть NULL.

Задача реализовать SELECT запрос с перебором всех возможных WHERE в зависимости от того какие параметры хранимки не NULL.

пример
если все параметры NULL
SELECT * FROM MyTable

если name указали:
SELECT * FROM MyTable WHERE name like %text%

если 2 параметра, то добавляется еще AND class like %class%
и т.д.

пока придумал только делать выгрузку ВСЕХ записей в tmp-близняшку таблицу, а затем через последовательный перебор всех входных параметров делать чистку tmp таблицы. и в конце хранимки отдавать результат.

но может есть какой способ сделать накопление WHERE условий, а затем сделать один запрос
SELECT * FROM MyTable WHERE *тут все собранные условия*


или я много хочу?
  • Вопрос задан
  • 1245 просмотров
Решения вопроса 2
wkololo_4ever
@wkololo_4ever
SELECT * FROM MyTable WHERE (@name is NULL OR Name LIKE '%'+@name+'%') AND (@class is null OR Class LIKE '%'+@class+'%')
и тд

Если параметров много, то советую добавить option(recompile)
Ответ написан
@dmitryKovalskiy
программист средней руки
например :
where (@param1 is null or @param1 = something) and (@param2 is null or .... и т.д.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
// поступили какие-то данные влияющие на поиск и условия
$a = $_POST['a']; // объявили переменную, допустим забрали данные с POST
$text = "some text";

Просто через условие:
if ($a == 0) {
	$Paste = "MyTable.`id` = 1";
} else if ($a == 1) {
	$Paste = "MyTable.`name` LIKE '%".$text."%'";
}

Или через массив, в который набираем параметры:
$array = array();

if ($a == 0) {
	// немного рагульно цепляем AND, через проверку длины массива
	if (strlen($array) > 0) {
		$array[] = "AND MyTable.`id` = 1";
	} else {
		$array[] = "MyTable.`id` = 1";
	}
}
if ($text == "some text") {
	if (strlen($array) > 0) {
		$array[] = "AND MyTable.`name` LIKE '%".$text."%'";
	} else {
		$array[] = "MyTable.`name` LIKE '%".$text."%'";
	}
}
$Paste = join(" ", $array); // объединяем через пробел

Формируем будущий запрос:
$sql = "
	SELECT * 
	FROM MyTable 
	WHERE ".$Paste."
";

Отправляем $sql на вызов, все, мы молодцы!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы