2012-02-06 2 views
1

に基づいてジョイン私は、ストアドプロシージャを持っているパラメータの値に基づいて、ジョイン内を持っている必要があります。また、コンマ区切りの値の文字列から値を分割する関数も使用しています。 NULL @earmarkであれば、私はこれがすべてで起こることを参加したくないT SQL条件がパラメータ値

Select * 
from view_Project as vp 
join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL) 

次のように私のコードは、私がこれに参加「%」または「119」または「119120121」の文字列を持っているそうでない場合、あります適切な結果が得られなければなりません。 @earmarkがnullの場合、私はちょうどそれが起こらないようにしたいと思っています。私はちょうど@earmarkを使用することができると思っていましたが、@earmarkはnullではありませんが、 @earmarkのparamと同じsprocを実行すると、すべての行が結果として得られます。私はこの結合を保持し、nullを渡すとき、私は行を取得しない、私はこれをしばらくの間、手伝ってきました、どんな助けも高く評価されるでしょう。ここで

はFUNCTIONです:

[inline_split_me](@param nvarchar(MAX)) 
RETURNS TABLE AS 
RETURN(SELECT ltrim(rtrim(convert(nvarchar(4000), 
    substring(@param, Number, 
     charindex(N',' COLLATE SQL_Latin1_General_CP1_CI_AS, 
     @param + convert(nvarchar(MAX), N','), 
    Number) - 
Number) 
))) AS Value 
    FROM APM_Numbers 
    WHERE Number <= convert(int, len(@param)) 
    AND substring(convert(nvarchar(MAX), N',') + @param, Number, 1) = 
        N',' COLLATE SQL_Latin1_General_CP1_CI_AS) 

がそれを手に入れた、ケイドルーなど

if (@earmark = '%') 
select * 
    from view_Project as vp 
    where vp.EarmarkId like @earmark 
else 
select * 
    from view_Project as vp 
    where @earmark is null or vp.EarmarkId in (select Value from inline_split_me(@earmark)) 
+0

@earmarkがnullの場合、結果はview_Projectのすべてである必要がありますか?その場合、inline_split_meに渡されたNULL値が望ましくない結果を生成しない限り、左外部結合を行うことができます。 –

+0

@earmarkがnullの場合はい、私はview_Project –

答えて

3

INNER JOINを感謝はあなたの問題です。 LEFT JOINは、LEFTの行を常に返します。@earmarkがNULLの場合、結合条件は決して真ではありません。

Select * 
from view_Project as vp 
LEFT join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL) 

あなたは@earmarkが

Select * 
from view_Project as vp 
INNER join (
    SELECT Value, -- columns here ... 
    FROM inline_split_me(@earmark) as e 
    UNION ALL 
    SELECT DISTINCT vp.EarmarkId AS Value, -- NULL, NULL, etc. 
    FROM view_Project 
    WHERE @earmark IS NULL 
) AS e 
    ON vp.EarmarkId LIKE e.Value 

NULLのときに参加する行を製造するUNIONと浮気でしたが、率直に言って、私は条件ロジックをするでしょう:

IF @earmark IS NULL 
    Select * 
    from view_Project as vp 
ELSE 
    Select * 
    from view_Project as vp 
    INNER join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL) 

の場合あなたはLIKEから離れていくことができます:

Select * 
from view_Project as vp 
WHERE @earmark IS NULL OR vp.EarmarkId IN (
    SELECT Value FROM inline_split_me(@earmark) 
) 
+0

からのすべての結果は、うーん、私はすでにこれを試みたが、結果は関係なく、私はあなたが '@のearmark'でない場合はINNER JOINをしたい@MichaelFullom SPROCを –

+0

に渡すものをすべての行ではありませんしたいですヌル?その場合、私は擬似鳴き声を作るためにUNIONをします - 私は私の答えを更新します。 –

+0

そうですが、@earmarkがnullの場合、joinは必要ありません。param値がnullであるかどうかに基づいて結合を行う方法があると思っただけですが、必要なように聞こえますどちらの場合でも明示的であるか? –

0

...as vp join lined_split_me(@earmark) as... はマッチが2つのテーブル間で発見された場合、クエリは、行だけを返すことを意味し、参加内側にデフォルト設定されるべきです。 @earmarkがnullの場合(明示的にinner joinを言ってダブルチェック。)

関数の呼び出しには(ゼロ)行を返さないのか?その場合は、問合せから戻される行はありません。

+0

...ちょうど2番目のコメントを見ました。はい、左外部結合はあなたが望むものです。 –