2012-05-20 14 views
6

मैं एक चयन कथन करता हूं। यदि परिणाम में पंक्तियों की संख्या किसी निश्चित संख्या से कम या बराबर है, तो मैं चयनित पंक्तियां वापस कर देता हूं। यदि पंक्तियों की संख्या किसी निश्चित संख्या से अधिक है, तो मैं कोई पंक्ति वापस नहीं करना चाहता हूं।कुछ शर्तों के तहत परिणाम परिणाम लौटने से बचें

का चयन चल रहा है और तुलना कर रही है, अगर पंक्तियों की संख्या की अनुमति दी पंक्तियों की संख्या से अधिक था के बाद, मैं निष्पादित करें:

SELECT TOP 0 NULL AS ID 

मैं क्या खोज की थी कि दोनों रिकॉर्ड है कि शुरू में चयन किया गया था रहे हैं आईडी और कोई रिकॉर्ड नामक एक कॉलम के साथ दूसरे परिणाम सेट के साथ भी लौट आया। जाहिर है, प्रारंभिक चयन कथन अभी भी वापस किया जा रहा है और मैं इससे बचना चाहता हूं। क्या कोई रास्ता है?

संपादित करें: यह जोड़ना भूल गया कि मुझे एक स्टेटस वैल्यू वापस करने की आवश्यकता है जो इंगित करता है कि अनुमति देने की तुलना में अधिक पंक्तियां थीं। इसका मतलब है कि मुझे गिनती पर जाना होगा और दो बार एक ही क्वेरी को चलाने के बिना गिनती करना पसंद करेंगे। इसलिए यदि अधिकतम पंक्तियों की अनुमति 25 है लेकिन शून्य पंक्तियां वास्तव में मौजूद हैं, तो मैं 0 की स्थिति लौटाता हूं लेकिन यदि पंक्तियों की संख्या 25 से अधिक है, तो मैं किसी भी पंक्ति को वापस नहीं करता हूं लेकिन मैंने स्थिति को सेट किया है - 1।

उत्तर

5

एक अस्थायी तालिका में चयन करें, तालिका में पंक्तियों की संख्या की जांच करें और अपने चयन या अस्थायी 0 पंक्तियों में अस्थायी तालिका का उपयोग करें।

-- Your query goes here 
select ID 
into #T 
from YourTable 
--where 

-- Check the number of rows returned 
if (select count(*) from #T) <= 10 
begin 
    -- Return the data 
    select ID 
    from #T 
end 
else 
begin 
    -- Don't return anything 
    select ID 
    from #T 
    where 0 = 1 
end 

drop table #T 

आप इसे count(*) over() का उपयोग करके एक प्रश्न में भी कर सकते हैं।

select ID 
from 
    (
    select ID, count(*) over() as C 
    from YourTable 
    --where 
) T 
where C <= 10 

या के साथ एक CTE

with C as 
(
    select ID 
    from YourTable 
    --where 
) 
select ID 
from C 
where (select count(*) from C) <= 10 

चुनें जो सबसे अच्छा अपनी आवश्यकताओं फिट बैठता है या अपने डेटा के साथ सबसे अच्छा प्रदर्शन करती है।

अद्यतन
एक संशोधित अस्थायी तालिका संस्करण जो पंक्ति गणना देता है।

SELECT ID FROM [YourTable] WHERE [Your Conditions] 

IF @@ROWCOUNT > [YourLimit] 
    SELECT ID FROM [YourTable] WHERE 0=1 // return empty records 
ELSE 
    SELECT ID FROM [YourTable] WHERE [Your Conditions] 

:

declare @MaxRows int 
set @MaxRows = 25 

declare @ActualRowCount int 

select top(@MaxRows+1) ID 
into #T 
from YourTable 

set @ActualRowCount = @@rowcount 

if @ActualRowCount = 0 
begin 
    -- No rows returned 
    select null as ID, 0 as [RowCount] 
end 
else 
if @ActualRowCount > @MaxRows 
begin 
    -- Too many rows returned 
    select null as ID, -1 as [RowCount] 
end 
else 
begin 
    -- Return rows from temp table 
    select ID, @ActualRowCount as [RowCount] 
    from #T 
end 

drop table #T 
+0

मैं कुछ उल्लेख करना भूल गया। मूल पोस्टिंग में मेरा ईडीआईटी देखें। आपका समाधान सही और वास्तव में अच्छा है, सिवाय इसके कि मुझे एक स्थिति वापस करने की आवश्यकता है, यह दर्शाता है कि बहुत सारे रिकॉर्ड हैं या नहीं। ऐसा लगता है कि मुझे दूसरी क्वेरी चलाने की ज़रूरत होगी। या मैं करूँ? – AndroidDev

+0

एक अस्थायी तालिका संस्करण जो पंक्ति गणना जानकारी के साथ कम से कम एक पंक्ति देता है जोड़ा गया। बहुत अधिक पंक्तियों के लिए '-1'। –

1

मैं तुम्हें एसक्यूएल सर्वर का उपयोग कर रहे हैं ताकि आप @@ROWCOUNT उपयोग कर सकते हैं मान तो यहाँ एक उदाहरण (पिछले बयान से प्रभावित पंक्तियों की संख्या देता ।)

यह सब

+1

पहले या दोनों वापस आ जाएगा, तो पहले हमेशा वापस आ जाएगा। क्या यह नहीं होगा? जबकि ओपी पूछता है कि कैसे एक या दूसरे को वापस करना है। – abatishchev

+0

जॉन के समाधान की तरह, इसे दो प्रश्नों को चलाने की आवश्यकता है। डेटा प्राप्त करने के लिए गिनती और दूसरा प्राप्त करने के लिए। क्या यह केवल एक प्रश्न (एक एकल निष्पादन निष्पादन) के साथ किया जा सकता है? – AndroidDev

1

अपनी पंक्ति गणना मानकों को चर में लोड करें और फिर SELECT:

DECLARE @rows INT; 
DECLARE @maxRows INT = 1000; --set your desired max value here 
SELECT @rows=COUNT(1) FROM [myTable]; 

SELECT ID FROM [myTable] 
WHERE @rows <= @maxRows; 

आप या तो एक खाली सेट मिल जाएगा जब वहाँ बहुत अधिक पंक्तियाँ हैं, या परिणाम सेट

+0

इसके अलावा अच्छा समाधान दो प्रश्नों को चलाने की आवश्यकता है। डेटा प्राप्त करने के लिए गिनती और दूसरा प्राप्त करने के लिए। एक अपशिष्ट की तरह लगता है। अच्छा होगा अगर केवल एक ही क्वेरी को चलाने की आवश्यकता है और यदि पंक्ति सीमा से अधिक हो तो पंक्तियां या कोई पंक्तियां वापस न करें। – AndroidDev

संबंधित मुद्दे