2017-03-20 6 views
1

を検索するとき、私は結果を返すクエリ持つ同じキーを持つ行を返す:いずれか一方のみの

DECLARE @VALUE_LIST varchar(1000) = 'B1' 
select * from mfr_attr 
where attr_val like '%' + @VALUE_LIST + '%' and field_id = 90 

enter image description here

を私はFIELD_IDに評価する声明「のような」欲しい= 90が、他の行もすべて返します。

私が間違っているものを考える上ではどこFIELD_ID = 90を使用することによって、それは他のFIELD_ID年代を返しませんが、私は唯一のそれのような声明必要があるということであるあなただけのグループに必要= 90

+1

あなたが実際に手に入れたいのはどういう意味でしょうか? '' like '文がfield_id = 90でのみ評価され、他のすべての行も返すようにしたいと思います。 – Lamak

+0

@Siyualはそれを持っていましたが、私はどのfield_idの行も意味します。 –

+0

実際には私は考えていませんが、これはすべての行を返していて、同様のフィルタを使用していません。 –

答えて

1

exists()を使用して:

DECLARE @VALUE_LIST varchar(1000) = 'B1' 
select * from mfr_attr m 
where exists (
    select 1 
    from mfr_attr i 
    where i.attr_val like '%' + @VALUE_LIST + '%' 
    and i.field_id = 90 
    and i.item_id = m.item_id 
    ) 

は、これはすべて返されますitem_idの場合はitem_idにはfield_id = 90の行があり、その行にはattr_valのような行があります。

+0

質問の質問と同じ結果が返ってくるのではないでしょうか。 –

+0

@ZoharPeledテーブルはおそらく** EAV **テーブルです。その場合、OPは 'attribute = 90'の' like'のような 'value'を持つ' entity'に関連するすべての行を必要とします。 'entity = item_id'、' attribute = field_id'と 'value = attr_val'の間にあります。 – SqlZim

+0

ええ、私はあなたが意味するものを参照してください... –

3

FIELD_IDに対する評価二つの条件と残りのORを使用します。

Declare @VALUE_LIST Varchar(1000) = 'B1'; 
Select * 
From mfr_attr 
Where (field_id = 90 And attr_val Like '%' + @VALUE_LIST + '%') 
Or  field_id != 90; 
+0

これはそれだと思いましたが、これはすべての行を返していて、likeフィルタを使用していません。 –

+0

@DavidTunnellよろしいですか?これは 'like'フィルタを' field_id = 90'のレコードにのみ適用するべきですが、それでも他のすべてを返します。それはあなたが探していたものではありませんか? – Siyual

関連する問題