Как уменьшить количество дублирующихся операторов SQL в хранимой процедуре при черчении данных запроса - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы написать оператор SQL, как показано ниже, для запроса данных, когда различные входные переменные в хранимой процедуре для MySQL / MariaDB:

DELIMITER ;;

CREATE PROCEDURE sp_WalletTransfer_GetWalletTransfers(IN IN_TypeCode smallint(6),IN IN_TransferStatusCode smallint(6), IN IN_PageIndex int, IN IN_PageCount int)
BEGIN
  DECLARE offsetValue INT;
  SET offsetValue = IN_PageCount*IN_PageIndex;
  IF IN_TypeCode = -1 AND IN_TransferStatusCode = -1 THEN
    SELECT
      Id, RefNo, TypeCode, TransferStatusCode, DateCreated, DateUpdated, MemberCode, MemberId, Amount, Memo
    FROM WalletTransfer
    ORDER BY DateCreated DESC
    LIMIT IN_PageCount OFFSET offsetValue;
  ELSEIF IN_TypeCode >0 AND IN_TransferStatusCode = -1 THEN
    SELECT
      Id, RefNo, TypeCode, TransferStatusCode, DateCreated, DateUpdated, MemberCode, MemberId, Amount, Memo
    FROM WalletTransfer
    WHERE TypeCode = IN_TypeCode
    ORDER BY DateCreated DESC
    LIMIT IN_PageCount OFFSET offsetValue;
  ELSEIF IN_TypeCode = -1 AND IN_TransferStatusCode > 0 THEN
    SELECT
      Id, RefNo, TypeCode, TransferStatusCode, DateCreated, DateUpdated, MemberCode, MemberId, Amount, Memo
    FROM WalletTransfer
    WHERE TransferStatusCode = IN_TransferStatusCode
    ORDER BY DateCreated DESC
    LIMIT IN_PageCount OFFSET offsetValue;
  ELSE
    SELECT
      Id, RefNo, TypeCode, TransferStatusCode, DateCreated, DateUpdated, MemberCode, MemberId, Amount, Memo
    FROM WalletTransfer
    WHERE TypeCode = IN_TypeCode AND TransferStatusCode = IN_TransferStatusCode
    ORDER BY DateCreated DESC
    LIMIT IN_PageCount OFFSET offsetValue;
  END IF;
END;;

DELIMITER ;

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

Как я могу это сделать?Любые намеки, пожалуйста!

1 Ответ

0 голосов
/ 25 января 2019

Как правило, я бы сделал что-то подобное ....

SELECT Id, RefNo, TypeCode, TransferStatusCode, DateCreated, DateUpdated, MemberCode, MemberId, Amount, Memo
FROM WalletTransfer
WHERE (IN_TypeCode= -1 OR TypeCode = IN_TypeCode)
  AND (IN_TransferStatusCode= -1 OR TransferStatusCode = IN_TransferStatusCode)
ORDER BY DateCreated DESC
LIMIT IN_PageCount OFFSET offsetValue;

... но это может сделать запрос намного медленнее;MySQL, как правило, не может использовать преимущества индексов при наличии условий OR.Лично я не заметил серьезных падений производительности, но обычно использовал эту технику только для «более легких» запросов (MySQL мог бы оптимизировать условия, которые мешали бы использованию индекса, поскольку сравнения -1 по сути являются однократными оценками, которые могут быть определены дозапрос выполняется полностью.) Это просто необходимо учитывать при выполнении подобных действий.

Примечание: я думаю, что в логике могут быть странные пробелы, когда IN_TypeCode иЗначения IN_TransferStatusCode равны 0;<= 0 может быть лучше, чем = -1

...