Правила для скобок в SQL.Кажется, не работает - PullRequest
0 голосов
/ 05 февраля 2019

плохо знаком с SQL.Возникли проблемы с операторами Like или% not like%, возвращающими неверные значения.Я думаю, что это круглые скобки.Когда я использую следующее, я все еще вижу «YMCA» и «United Way», хотя я выбираю их.Я попытался вложить отдельные скобки в одну большую скобку, я попытался поместить отдельные скобки вокруг каждого утверждения.Ничего не работаетВот кодЛюбой совет высоко ценится!

SELECT TRANSACTION_DATE, MERCHANT_NAME 
FROM CardTrans 
WHERE 
   (
     (TRANSACTION_DATE BETWEEN '2018-03-01' AND  '2018-03-15') 
     OR 
     (    TRANSACTION_DATE IS NULL 
      AND POST_DATE BETWEEN '2018-03-01' AND '2018-03-15')
   ) 
AND (TRANSACTION_BASE_TYPE = 'debit') 
and  (DESCRIPTION LIKE '%SWAIR%') 
OR   (DESCRIPTION LIKE '%SW AIR%') 
OR   (DESCRIPTION LIKE '%SWA INFL%') 
OR   (DESCRIPTION LIKE '%*Southwest Air%') 
AND   DESCRIPTION NOT LIKE '%AMAZON%' 
AND   DESCRIPTION NOT LIKE '%AMZ%' 
AND   DESCRIPTION NOT LIKE '%YMCA OF SOUTHWES%' 
AND   DESCRIPTION NOT LIKE '%UNITED WAY OF SOUTHWES%' 
ORDER BY DESCRIPTION;
GO   

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Я предполагаю, что вы хотите:

WHERE ( (TRANSACTION_DATE BETWEEN '2018-03-01' AND  '2018-03-15') OR 
        (TRANSACTION_DATE IS NULL AND POST_DATE BETWEEN '2018-03-01' AND '2018-03-15')
      ) AND
      TRANSACTION_BASE_TYPE = 'debit' AND  
      (DESCRIPTION LIKE '%SWAIR%' OR
       DESCRIPTION LIKE '%SW AIR%' OR
       DESCRIPTION LIKE '%SWA INFL%' OR 
       DESCRIPTION LIKE '%*Southwest Air%'
      ) AND
      DESCRIPTION NOT LIKE '%AMAZON%' AND 
      DESCRIPTION NOT LIKE '%AMZ%' AND 
      DESCRIPTION NOT LIKE '%YMCA OF SOUTHWES%' AND 
      DESCRIPTION NOT LIKE '%UNITED WAY OF SOUTHWES%' 

Ваша проблема в понимании правил приоритета для AND и OR.AND имеет более высокий приоритет, поэтому:

 DESCRIPTION LIKE '%SWA INFL%' OR 
 DESCRIPTION LIKE '%*Southwest Air%' AND
 DESCRIPTION NOT LIKE '%AMAZON%'

Анализируется как:

 DESCRIPTION LIKE '%SWA INFL%' OR 
 (DESCRIPTION LIKE '%*Southwest Air%' AND
  DESCRIPTION NOT LIKE '%AMAZON%'
 )

И вы можете увидеть AMAZON в результатах.

0 голосов
/ 05 февраля 2019

У вас есть серия AND с, которые исключают '%YMCA OF SOUTHWES%', а также '%UNITED WAY OF SOUTHWES%'но у вас также есть эти OR s:

    ...  OR
   (DESCRIPTION LIKE '%SW AIR%') OR
   (DESCRIPTION LIKE '%SWA INFL%') OR 
   (DESCRIPTION LIKE '%*Southwest Air%')

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

0 голосов
/ 05 февраля 2019

Это ваш запрос, удаляющий все ненужные скобки

SELECT TRANSACTION_DATE, MERCHANT_NAME 
FROM CardTrans 
WHERE (
 TRANSACTION_DATE BETWEEN '2018-03-01' AND  '2018-03-15'           
    OR 
  TRANSACTION_DATE IS NULL 
  AND POST_DATE BETWEEN '2018-03-01' AND '2018-03-15'
       )     
AND TRANSACTION_BASE_TYPE = 'debit'
and DESCRIPTION LIKE '%SWAIR%'
OR DESCRIPTION LIKE '%SW AIR%' 
OR DESCRIPTION LIKE '%SWA INFL%'
OR DESCRIPTION LIKE '%*Southwest Air%'
AND DESCRIPTION NOT LIKE '%AMAZON%' 
AND DESCRIPTION NOT LIKE '%AMZ%' 
AND DESCRIPTION NOT LIKE '%YMCA OF SOUTHWES%' 
AND DESCRIPTION NOT LIKE '%UNITED WAY OF SOUTHWES%' 
ORDER BY DESCRIPTION; GO 

Помните, что И выполняются до ИЛИ, поэтому 1 ИЛИ 2 И 2 ИСТИНА -> (2AND2) ИЛИ1

...