2016-07-08 7 views
2

私は2つのほぼ同じレコードを持っています。 "Request ID"にnull値が含まれ、もう1つがnullです。私は、その列のnull値を持っていないものをフィルタリングしたいが、キーワードに基づいてデータをフィルタリングすることも考えている。IS NOT NULLとSQLのフィルタ

例:
検索:プロジェクト名や発信

結果:プロジェクト名を検索するバックヌルなしでエントリを取得し、「リクエストID」の値

は私が必要なものを私を取得しますOriginatorを検索しても、どちらも結果が得られますか?

USE [ResourceRequest] 
GO 
    SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[search_project_bykeyword] 
(@ProjectName varchar(100)=NULL 
,@Originator varchar(100)=NULL) 
AS 
SELECT * 
FROM [dbo].[Resource_Request] 
WHERE [Request ID] IS NOT NULL 
AND 
[Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%' 

答えて

2

はちょうどこの部分の周りに括弧を入れて、あなたは問題ないはずです::

(
[Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%' 
) 

問題の理由はORがあなたを作ることだった。ここ

は、私がこれまでにしたものです他のフィルタに関係なく、Originatorフィルタと一致するすべての行に対してtrueをフィルタリングするため、[Originator] LIKE @Originator + '%'の場合、[Request ID] IS NOT NULLフィルタは無視されます。

+0

感謝。あなたが最初に応答して以来、私はあなたの答えを持って行くつもりです。再度、感謝します。:) – thatdude

4

グループあなたWHERE条件

WHERE [Request ID] IS NOT NULL 
AND 
([Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%') 
9

AND takes precedence over OR以下のようにそれらを括弧で囲むこともできます。

SELECT * 
FROM  [dbo].[Resource_Request] 
WHERE [Request ID] IS NOT NULL 
AND 
(
     [Project Name] LIKE @ProjectName + '%' 
    OR [Originator] LIKE @Originator + '%' 
) 

グループ化の理由は、上記の優先順位によるものです:あなたは、あなたのグループANDORステートメントする必要があります。この順序は次のとおりです。これはある意味何

Level Operators 
1  ~ (Bitwise NOT) 
2  * (Multiply),/(Division), % (Modulo) 
3  + (Positive), - (Negative), + (Add), (+ Concatenate), - (Subtract), & (Bitwise AND),^(Bitwise Exclusive OR), | (Bitwise OR) 
4  =, >, <, >=, <=, <>, !=, !>, !< (Comparison operators) 
5  NOT 
6  AND 
7  ALL, ANY, BETWEEN, IN, LIKE, OR, SOME 
8  = (Assignment) 

、あなたのAND文の全てが最初に評価されます。彼らがすべて評価された後、、次にORというステートメントが評価されます。

これはあなたのクエリがコンパイラにより次のようになります:

WHERE 
( 
     [Request ID] IS NOT NULL 
    AND [Project Name] LIKE @ProjectName + '%' 
) 
OR  [Originator] LIKE @Originator + '%' 

あなたが探していた節されていません。あなたはこれらの二つのセットとして評価されるべきであることをコンパイラに伝えると、そのセットと[Request ID]部との間ANDを使用すると、同じ優先レベルでそれを維持している、あなたのWHERE句の[Project Name][Originator]セグメントをグループ化することで

。演算子の優先順位をよく読んで

+0

コードが問題を解決しているが、 "ANDはORよりも優先される"というステートメントはあいまいであるか、間違っている。 –

+6

@Tab Allemanどのように?正確で曖昧でないようです。 https://msdn.microsoft.com/en-CA/library/ms190276.aspx – pabrams

+0

@pabramsありがとう、ちょうどそれを探していた! – Siyual