2011-10-13 7 views
2

以下は、既存の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%、バッチタイプ= 'PA'のようなレコードがあります。私は結果にこれらの記録を残したいと思います。私は提供されたアイディアに感謝します。

+2

あなたが得意でない結果は何ですか? – CamelSlack

+0

なぜ、「btype = 'PC'」とし、 'btype <> 'PC' 'を置くのはなぜですか? – Lamak

+0

SQLに余分な括弧があるか、または1つが欠落しています... – Matthew

答えて

2

クエリには、上位と下位の文字列比較対象が含まれています。私が知る限り、SQL Serverはデフォルトでは大文字と小文字が区別されません。それはあなたの質問を引き上げているのでしょうか? this answerごとに照合を確認してください。

EDIT:更新された質問に基づいて、正面にNOTを使用する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

はい!それはまさに私がする必要があったものです。私はあまりにも多くの時間を費やして、それらのレコードをフィルタリングするために "NOT"引数を使用できることを知らずに、そのステートメントをまとめようとしました。ありがとうございます!! – 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句にこの条件を追加します。あなたの他の結果はOKであり、あなたはちょうどそれらをフィルタリングしたい、全体のクエリが

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

希望だろうと仮定すると、

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

それはあなたのために働く。

0

句を作成するときは、括弧を使用してすべてをまっすぐに保つことをお勧めします。複数を使用している場合もありません...あなたが論理和を使用して一緒に条件を好まないのすべてを組み合わせて、このような個別の条件の内部でそれらをラップする必要がありステートメントをLIKE


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のテーブル内のすべてのBuilderプロパティ名を返します。

関連する問題