2011-10-13 3 views
2

Ниже представлен существующий запрос отчета sql server 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%» и «ЕМС%» и batchtype = 'ПК'. Как видно из набора результатов, есть записи, где клиент похож на FTS% и batchtype = 'PA'. Я хотел бы сохранить эти записи в результатах. Я был бы признателен за любые предлагаемые идеи.

+2

Каковы нежелательные результаты, которые вы получаете? – CamelSlack

+0

Итак, почему вы говорите «только когда btype =« ПК », а затем положите' btype <> 'PC''? – Lamak

+0

У вашего SQL есть дополнительная скобка, или она отсутствует ... – Matthew

ответ

2

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

EDIT: На основании вашего обновленного вопроса вы можете не просто использовать предложение AND, которое использует НЕ на передней панели? Другими словами, добавьте предложение «AND not (x)», где «x» - это условия, которые определяют записи, которые вы хотите исключить? Вам нужно будет вложить тест клиента, потому что это OR. например:

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

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

+0

ДА !! Это именно то, что мне нужно было сделать. Я потратил слишком много времени, пытаясь свести это утверждение, не зная, что могу использовать аргумент «НЕ» для фильтрации этих записей. Спасибо всем!! – user992322

+0

Отлично!Также - если он отвечает на ваш вопрос, можете ли вы отметить его как ответ? – Geoff

0

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

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' 
0

Добавить это условие в предложении 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

При создании комплекса, где предложения, рекомендуется использовать круглые скобки, чтобы держать все прямо. Также при использовании нескольких НЕ НРАВИТСЯ заявления вы должны объединить все НЕ НРАВИТСЯ условия вместе с помощью ОША и обернуть их внутри отдельного И состояния, как это ...


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 
2
$sql="select * from builder_property where builder_pro_name LIKE '%%' OR builder_pro_name LIKE '%za%' AND status='Active'"; 

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

Смежные вопросы