SQL: проблемы с лайками и НЕ как - PullRequest
1 голос
/ 08 июля 2010

У меня есть это заявление в доступе:

SELECT *
FROM accountsnew
WHERE [Panels] not like '*IT_OXYC,*' and [Panels] not like '*OXY_SN,*' and [Panels] not like '*OXY_S,*' and [Panels] not like '*OXY_N,*' and [Panels] like '*OXYC_SNEG,*' or [Panels] like '*OXYC_PNEG,*';

по какой-то причине он не возвращает правильный набор данных. когда я смотрю более подробно на возвращенные данные, используя Excel, я вижу, что то, что они действительно возвращали, содержало IT_OXYC, и некоторые другие параметры.

что-то не так с моим утверждением?

Я пытаюсь получить все записи, которые не имеют IT_OXYC, OXY_SN, OXY_S, etc ... и имеют либо OXYC_SNEG,, либо OXYC_PNEG,

Ответы [ 7 ]

3 голосов
/ 08 июля 2010

Это, вероятно, просто приоритет ... определите его фигурными скобками, чтобы установить приоритет: ГДЕ (панели НЕ НРАВИТСЯ '1' И панели НЕ НРАВИТСЯ '2') И (панели НРАВИТСЯ '3' ИЛИ ​​панели НРАВИТСЯ '4')

2 голосов
/ 08 июля 2010

Ваша логика неверна.Переводит ваш запрос побитно:

Я пытаюсь получить все записи

SELECT * FROM accountnew

, которые не

ГДЕ НЕ (...)

с IT_OXYC или OXY_SN или OXY_S и т. Д. ...

(x LIKE ' IT_OXYC 'ИЛИ X LIKE' IOXY_SN 'ИЛИ x LIKE' OXY_S 'ИЛИ ...)

и У них есть либо OXYC_SNEGили OXYC_PNEG,

И (x LIKE ' OXYC_SNEG ' OR x LIKE ' OXYC_PNEG ')

Собираем все вместе:

SELECT *
FROM accountsnew
WHERE NOT ([Panels] LIKE '*IT_OXYC*' OR
           [Panels] LIKE '*IOXY_SN*' OR
           [Panels] LIKE '*OXY_S*' OR ...)
AND ([Panels] LIKE '*OXYC_SNEG*' OR 
     [Panels] LIKE '*OXYC_PNEG*')
1 голос
/ 22 марта 2012

Не используйте ИЛИ не используйте И это будет работать правильно

1 голос
/ 08 июля 2010

некоторые из ваших записей, которые содержат oxyc_sneg и oxcy_pneg, также содержат it_oxcy и другие ....

Итак, когда вы пытаетесь получить записи, где [Панели] как ' OXYC_SNEG, 'или [Панели], такие как' OXYC_PNEG, , он также дает вам несколько записей, которые содержат как OXYC_SNEG и it_oxcy, так и OXYC_PNEG и it_oxcy и т. д.что-то вроде

SELECT *
FROM accountsnew
WHERE { [Panels] like '*OXYC_SNEG,*' and 
{[Panels] not like '*IT_OXYC,*' and [Panels] not like '*OXY_SN,*' and [Panels] not like '*OXY_S,*' and [Panels] not like '*OXY_N,*}
}
or 
{[Panels] like '*OXYC_PNEG,*' and  
{[Panels] not like '*IT_OXYC,*' and [Panels] not like '*OXY_SN,*' and [Panels] not like '*OXY_S,*' and [Panels] not like '*OXY_N,*} }

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

1 голос
/ 08 июля 2010

Я помню, с Access это работает лучше сказать

SELECT *
FROM accountsnew
WHERE NOT [Panels] like '*IT_OXYC,*' 
    and not [Panels] like '*OXY_SN,*' 
    and not [Panels] like '*OXY_S,*' 

и т.д.

1 голос
/ 08 июля 2010

прошу прощения, моя дорогая тетя Салли: вам может понадобиться несколько скобок, чтобы получить, что вы делаетеЯ подозреваю, что вам нужно поместить их в конце, например:

SELECT *
FROM accountsnew
WHERE ([Panels] not like '*IT_OXYC,*' and [Panels] not like '*OXY_SN,*' and [Panels] not 
like '*OXY_S,*' and [Panels] not like '*OXY_N,*') 
and ([Panels] like '*OXYC_SNEG,*' or [Panels] like '*OXYC_PNEG,*');
1 голос
/ 08 июля 2010

Не уверен, если это что-то меняет, но я бы поставил скобки в конце так:

WHERE [Panels] not like '*IT_OXYC,*' and [Panels] not like '*OXY_SN,*' and [Panels] not like '*OXY_S,*' and [Panels] not like '*OXY_N,*' and ([Panels] like '*OXYC_SNEG,*' or [Panels] like '*OXYC_PNEG,*');

У вас есть один OR в строке, содержащей только AND с.Возможно, он видит одну из OR истинной и думает, что вся строка истинна

...