2016-03-30 14 views
0

Bu soru this birMadde [Birden]

ben boş, olarak varsayılan değeri 3 sql parameter sahip olduğu tek fark benzer ve eğer kullanıcı bu değerlerin herhangi sağlar nerede Değişken Sonra Yok Blank ise,

begin 
SELECT * FROM Careers where 
     ((@position is null and Position is null) 
    or (Position = @position)) and 
     ((@country is null and Location is null) 
    or (Location = @country)) and 
     ((@state is null and StateID is null) 
    or (StateID = @state)) 
end 
: Ben bu yaklaşımı denedi

create procedure [dbo].[SearchCareer] 
@country int =null, 
@state int =null, 
@position int=null 
as 

begin 
SELECT * FROM Careers where [email protected] and @[email protected] and @[email protected] 
end 

: onlar where maddesi burada saklanan yordam olduğunu dahil edilmelidir

Kullanıcı yalnızca konum girdiğinde ancak diğer durumlarda çalışmadığında iyi çalışır.

IF , ELSE IF'u kullanabileceğimi biliyorum Sorgumu kontrol etmek ve oluşturmak için, ancak bundan kaçınmak istiyorum.

+0

Burada neler olup bittiği, tüm sorguları bir sorgu olarak bilinir. Çok yaygındır ve yanlış yapılırsa performans için inanılmaz derecede korkunç olabilir. Mantığın nasıl işleneceğini ve bu tür bir sorgulamanın performansını açıklayan bu makaleye göz atın. http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

+0

Yapmak istediğinizden emin misiniz @ country null ve Location is null' (ve benzeri)? Normalde bir '(@prm null OR colValue = @ prm) ve ...' – Shnugo

+0

@SeanLange bağlantınız için teşekkürler. IF, ELSE IF ya da bu yaklaşımın daha iyi olduğu fikrinize göre. Masaım çok büyük değil .. neredeyse 10k-20k kayıtları olacak. – KanisXXX

cevap

1

Bu muhtemelen düşündüğünüze yakın. Tablo büyükse, bu tür bir yaklaşımın performansı sorunlu hale gelebilir. Burada bazı tahminler yapmak zorunda kaldım çünkü bir değişkenin bir değişkenin aynı değişkene eşit olup olmadığını kontrol etmek gibi şeyler yapıyorsun.

SELECT * --You really should use only the columns you need instead of * 
FROM Careers 
where (Location = @country OR @country is null) 
and ([state] = @state OR @state is null) 
and (position = @position or @position is null) 
+0

Mükemmel çalışıyor .. !! :) – KanisXXX

-1

İstediğin yapacak:

SELECT * FROM Careers where case @country when is null THEN @country ELSE Location [email protected] and case @state when is null THEN @state ELSE State [email protected] and case @position when is null THEN @position ELSE Position [email protected] 

iki diğer alanlarda Devleti ve Konum olduğunu varsaydık.

+0

Daha iyi okunabilirlik sağlamak için lütfen sorgunuzu biçimlendirebilir misiniz? Ayrıca lütfen bu sorgunun neden ve nasıl çözüleceğini sorun. – Pred

+0

Bu yayınlandığı gibi çalışmayacak. Sözdizimi hatalarıyla dolu. "Ne zaman boş" diye buna sahip olamazsın. –