выберите запрос, используя несколько одинаковых условий - PullRequest
2 голосов
/ 13 октября 2011

Ниже приведен существующий запрос отчета MS SQL Server 2008.

SELECT
    number, batchtype, customer, systemmonth, systemyear, entered, comment, totalpaid
FROM
    payhistory LEFT OUTER JOIN agency ON
        payhistory.SendingID = agency.agencyid      
WHERE
    payhistory.batchtype LIKE 'p%' AND
    payhistory.entered >= '2011-08-01 00:00:00.00' AND
    payhistory.entered <  '2011-08-15 00:00:00.00' AND
    payhistory.systemmonth = 8 AND
    payhistory.systemyear = 2011 AND
    payhistory.comment NOT LIKE 'Elit%'

Результаты будут выглядеть так:

number  batchtype   customer    systemmonth systemyear  entered     comment         totalpaid
6255756 PC      EMC1106     8       2011        12:00:00 AM DP From - NO CASH       33
5575317 PA      ERS002      8       2011        12:00:00 AM MO-0051381526 7/31      20
6227031 PA      FTS1104     8       2011        12:00:00 AM MO-10422682168 7/30     25
6232589 PC      FTS1104     8       2011        12:00:00 AM DP From - NO CASH       103
2548281 PC      WAP1001     8       2011        12:00:00 AM NCO DP $1,445.41        89.41
4544785 PCR     WAP1001     8       2011        12:00:00 AM NCO DP $1,445.41        39

То, что я пытаюсь сделать, это изменить запрос, который исключит записи, в которых клиент похож на 'FTS%' и 'EMC%' и batchtype = 'PC'. Как вы можете видеть в наборе результатов, есть записи, где клиент похож на FTS% и batchtype = 'PA'. Я хотел бы сохранить эти записи в результатах. Буду признателен за любые предложенные идеи.

Ответы [ 5 ]

2 голосов
/ 25 декабря 2013
$sql="select * from builder_property where builder_pro_name LIKE '%%' OR builder_pro_name LIKE '%za%' AND status='Active'";

Это вернет все имя свойства компоновщика в таблице, имя которого оканчивается как plaza или complex.

2 голосов
/ 13 октября 2011

Ваш запрос содержит сочетание целей сравнения верхней и нижней строк. Насколько я знаю, SQL Server по умолчанию не чувствителен к регистру; Возможно ли это, что отключает ваш запрос? Проверьте сопоставление по этому ответу .

РЕДАКТИРОВАТЬ: Исходя из вашего обновленного вопроса, вы не можете просто использовать предложение AND, которое использует NOT на передней панели? Другими словами, добавьте предложение «AND not (x)», где «x» - это условия, которые определяют записи, которые вы хотите исключить? Вам нужно вложить тест клиента, потому что это ИЛИ. e.g.:

... payhistory.comment NOT LIKE 'Elit%'
AND not ((customer like 'FTS%' or customer like 'EMC%') AND batchtype = 'PC')

В качестве примечания, я считаю, что предложение LIKE может подразумевать неэффективное сканирование таблицы в некоторых (но не во всех ) случаях, поэтому, если этот запрос будет использоваться в роли, чувствительной к производительности, вы можете хотите проверить план запроса и оптимизировать таблицу под себя.

0 голосов
/ 14 октября 2011

При построении комплекса, в котором содержатся предложения, рекомендуется использовать круглые скобки, чтобы все было по-прямому. Также при использовании нескольких операторов NOT LIKE необходимо объединить все условия NOT LIKE вместе, используя ORs , и обернуть их внутри отдельного AND состояние, подобное этому ...


WHERE     
    (payhistory.batchtype LIKE 'p%')
AND (payhistory.entered >= '2011-08-01 00:00:00.00')
AND (payhistory.entered <  '2011-08-15 00:00:00.00')
AND (payhistory.systemmonth = 8 )
AND (payhistory.systemyear = 2011)
AND ( // BEGIN NOT LIKE CODE

    (payhistory.comment NOT LIKE 'Elit%') 

OR  (
    (payhistory.customer NOT LIKE 'EMC%') AND 
    (payhistory.batchtype = 'PC')
    ) 

OR  (
    (payhistory.customer NOT LIKE 'FTS%') AND 
    (payhistory.batchtype = 'PC')
    )

    ) //END NOT LIKE CODE
0 голосов
/ 14 октября 2011

Добавьте это условие в предложение WHERE:

NOT((customer LIKE 'FTS%' OR customer LIKE 'EMC%') AND batchtype='PC')

Если предположить, что с другими вашими результатами все в порядке и вы просто хотите отфильтровать их, весь запрос будет

SELECT
    number, batchtype, customer, systemmonth, systemyear, entered, comment, totalpaid
FROM
    payhistory 
    LEFT OUTER JOIN agency ON
        payhistory.SendingID = agency.agencyid      
WHERE
    payhistory.batchtype LIKE 'p%' AND
    payhistory.entered >= '2011-08-01 00:00:00.00' AND
    payhistory.entered <  '2011-08-15 00:00:00.00' AND
    payhistory.systemmonth = 8 AND
    payhistory.systemyear = 2011 AND
    payhistory.comment NOT LIKE 'Elit%' AND
    NOT((payhistory.customer LIKE 'FTS%' OR payhistory.customer LIKE 'EMC%') AND payhistory.batchtype='PC')

Надеюсь, что это работает для вас.

0 голосов
/ 13 октября 2011

Это может быть потому, что ваш сервер может быть чувствительным к регистру. В этом случае ниже запрос будет работать.

SELECT
table1.number, table1.btype, table1.cust, table1.comment, table2.ACode
FROM
table1 LEFT OUTER JOIN table2 ON table1.1ID = table2.2ID
WHERE
lower(table1.btype) LIKE 'p%' AND
lower(table1.comment) NOT LIKE 'yyy%' AND
lower(table1.cust) NOT LIKE 'abc%' AND
lower(table1.cust) NOT LIKE 'xyz%' AND
lower(table1.btype) <> 'pc'
...