Условие SQLite

#database #sqlite

#База данных #sqlite

Вопрос:

Я просто хочу преобразовать этот запрос функции из navicat в запрос sqlite,

  Select * from tbl_sample where ID = 1 And IF (
        RECEIPT_MODE = 'MANUAL',
        DATE(a.MANUAL_COLLECTION_DATE) = DATE('2016-08-10 04:18:00'),
        DATE(TPAY_ISSUED_DATE) = DATE('2016-08-10 04:18:00')
    )
  

Ответ №1:

Попробуйте выполнить этот запрос:

 SELECT *
FROM tbl_sample
WHERE ID = 1 AND
(
    (RECEIPT_MODE = 'MANUAL' AND
     DATE(a.MANUAL_COLLECTION_DATE) = DATE('2016-08-10 04:18:00')) OR
    (RECEIPT_MODE <> 'MANUAL' AND
     DATE(TPAY_ISSUED_DATE) = DATE('2016-08-10 04:18:00'))
)
  

Используйте правило перезаписи DNF в CNF, чтобы снизить уровень скобок / вложенности:

 SELECT *
FROM tbl_sample
WHERE ID = 1 
AND ( RECEIPT_MODE <> 'MANUAL' OR
      DATE(a.MANUAL_COLLECTION_DATE) = DATE('2016-08-10 04:18:00') )
AND ( RECEIPT_MODE = 'MANUAL' OR 
      DATE(TPAY_ISSUED_DATE) = DATE('2016-08-10 04:18:00') )
  

Ответ №2:

Стандартным механизмом SQL для этого IF было бы выражение CASE:

 Select * from tbl_sample where ID = 1 And CASE
       WHEN RECEIPT_MODE = 'MANUAL'
       THEN DATE(a.MANUAL_COLLECTION_DATE) = DATE('2016-08-10 04:18:00')
       ELSE DATE(TPAY_ISSUED_DATE) = DATE('2016-08-10 04:18:00')
   END