Сложный вопрос MySQL - PullRequest
       4

Сложный вопрос MySQL

1 голос
/ 13 октября 2011

У меня несколько сложный запрос mySQL, который я пытаюсь выполнить.У меня есть два параметра: средство и isEnabled.Объект может иметь значение «ВСЕ» или быть конкретным идентификатором.isEnabled может иметь значение «ALL» или быть 0/1.

Моя проблема в том, что мне нужно придумать логику, которая может обрабатывать следующие сценарии: 1) Facility = ALL AND isEnabled = ALL 2) Facility= ALL AND isEnabled = значение 3) Средство = someID AND isEnabled = ALL 4) Средство = someID AND isEnabled = значение

Проблема в том, что у меня есть несколько вложенных операторов IF:

IF (Facility = 'ALL') THEN
  IF (isEnabled = 'ALL') THEN
    SELECT * FROM myTable
  ELSE
    SELECT * FROM myTable
    WHERE isEnabled = value
  END IF;
ELSE
  IF (isEnabled = 'ALL') THEN
    SELECT * FROM myTable
    WHERE facility = someID
  ELSE
    SELECT * FROM myTable
    WHERE facility = someID AND isEnabled = value
  END IF;
END IF;

Я хотел бы иметь возможность объединить логику в предложении WHERE, используя либо оператор CASE, либо условный оператор (И / ИЛИ), но у меня возникают проблемы, когда я обдумываю его сегодня утром.В настоящее время запрос не выполняется, как ожидается.

Любое понимание будет полезным!Спасибо

1 Ответ

2 голосов
/ 13 октября 2011

Вы могли бы сделать это ...

SELECT
  *
FROM
  myTable
WHERE
  1=1
  AND (facility  = someID OR Facility  = 'ALL')
  AND (isEnabled = value  OR isEnabled = 'ALL')

Однако это приводит к плохому плану выполнения - он пытается найти один размер для всех, но каждая комбинация параметров может иметь разные планы в зависимости от данных, индексов и т. Д.

Это означает, что лучше строить запрос динамически

SELECT
  *
FROM
  myTable
WHERE
  1=1
  AND facility  = someID  -- Only include this line if : Facility  = 'ALL'
  AND isEnabled = value   -- Only include this line if : isEnabled = 'ALL'

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

Ссылка: Динамический поиск

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...