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

0

Каков наиболее эффективный способ создания динамического sp, где im проверяет параметр NAME либо его значение null, либо имеет значение. моя цель состоит в том, чтобы выбрать конкретное имя, а их данные еще просто отображать все имя с данными, если параметр NAME имеет значение null или не имеет значения. Здесь мое решение 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;

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

  • 0
    Вы можете прочитать о NULL против '' . Они не являются взаимозаменяемыми.
Теги:
stored-procedures
where-clause

1 ответ

0

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

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() здесь, но не делайте этого.

Используйте правильные даты повсюду или используйте STR_TO_DATE() для преобразования параметров, а не DATE_FORMAT() в столбец. Вы не можете сравнивать mm/dd/yyyy "между" двумя значениями. Это не имеет смысла. 12/09/2010 "между" 12/08/2017 и 12/10/2017, потому что ваш код сравнивает строки, lexcally, не сравнивая даты.

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

  • 0
    Спасибо за решение, сэр, но я все еще не получил все данные, если pNAME IS NULL. Я использую DATE_FORMAT () просто для того, чтобы легко получить свои данные, как в БД, и сравниваю 2 даты, чтобы получить данные, которые находятся внутри этих дат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню