Хранимая процедура, ГДЕ динамически проверяет, является ли параметр ИМЯ нулевым ИЛИ имеет значение - PullRequest
0 голосов
/ 24 мая 2018

Каков наиболее эффективный способ создания динамического sp, в котором я проверяю параметр NAME либо на ноль, либо на значение.my GOAL здесь, чтобы выбрать конкретное имя и их данные else просто отобразить все имя с данными, если param NAME равно нулю или имеетзначение не представлено.Вот мое решение 2:

вариант 1

IF (SELECT call_transactions.`called_name` IS NULL FROM call_transactions) THEN
    SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
    FROM call_transactions a
    WHERE a.`user_id` = pUSERID AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
    ORDER BY a.start_datetime DESC;
ELSE
    SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
    FROM call_transactions a
    WHERE a.`user_id` = pUSERID AND a.called_name = pNAME AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
    ORDER BY a.start_datetime DESC;
END IF;

вариант 2

SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
FROM call_transactions a
WHERE a.`user_id` = pUSERID AND (a.called_name = pNAME OR pNAME = '') AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
ORDER BY a.start_datetime DESC;

Заранее спасибо запросветители, ребята.Просто любопытный ребенок здесь

1 Ответ

0 голосов
/ 24 мая 2018

Используйте ваш второй вариант, но проверьте правильность значения.

WHERE a.`user_id` = pUSERID 
  AND (pNAME IS NULL OR a.called_name = pNAME) 
  AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND

Во втором условии обратите внимание, что я перевернул условия.

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

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

Я не знаю, что вы делаете с DATE_FORMAT() здесь, но не делайте этого.

Используйте правильноdatetime везде или используйте STR_TO_DATE() для преобразования параметров, а не DATE_FORMAT() для столбца.Вы не можете сравнить мм / дд / гггг "между" двумя значениями.Это не имеет смысла.12/09/2010 "между" 08.12.2017 и 12.10.2017, потому что ваш код сравнивает строки, лексически, а не сравнивает даты.

Как правило, вы никогда не должны использовать столбец какаргумент для функции в WHERE, потому что это побеждает любые индексы в столбце и вызывает полное сканирование.

...