2016-08-09 22 views
5

Schreiben Sie ein Programm unter Verwendung von SQL, die die Zahlen druckt von 1 bis 100.schreiben Abfrage ohne Schleife

Aber für ein Vielfaches von drei print „Fizz“ anstelle der Anzahl und für die ein Vielfaches von fünf print „Buzz“. Für Zahlen, die ein Vielfaches von beiden drei und fünf Druck sind „FizzBuzz“

DECLARE @counter INT 
DECLARE @output VARCHAR(8) 
SET @counter = 1 
WHILE @counter < 101 
BEGIN 
SET @output = '' 
IF @counter % 3 = 0 
SET @output = 'Fizz' 
IF @counter % 5 = 0 
SET @output = @output + 'Buzz' 
IF @output = '' 
SET @output = @counter 
PRINT @output 
SET @counter = @counter + 1 
END 

Dies gibt gewünschte Ausgabe. Aber, ich werde gebeten, keine Schleife zu verwenden, ist es möglich, dies auf andere Weise zu tun? Wie wäre es mit CTE?

Antwort

5
;With cte(n)--this is a recursive cte 
as 
(
select 1--anchor part 
union all 
select n+1 
from cte where n<100 --recursive part,when this completes we have a temp table of 100 numbers 
) 
select 
case when n%3=0 and n%5=0 then 'Fizz Buzz' 
    when n%5=0 then 'Buzz' 
    when n%3=0 then 'Fiz' 
    else cast(n as varchar(4)) end 
from cte 

Aus dieser Tabelle sind wir mit Fall modulo.Read unter Artikel berechnen heraus, warum Zahlen Tabellen sind nützlich und wie sie Schleifen ersetzen ..

1. http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/you-require-a-numbers-table.aspx
2. http://www.sqlservercentral.com/articles/T-SQL/62867/
3. https://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable

+0

Dank, ein wenig Erklärung wäre hilfreich ... – BlackCat

+1

@Zahid: Ich habe hinzugefügt paar Links und eine Erklärung, gehen Sie bitte durch sie – TheGameiswar

+0

Dank. Ich weiß ein bisschen über CTE, aber cte (n) Begriff verwirrt mich.Ist es eine Funktion? – BlackCat

0

1) Erstellen Sie eine temporäre Tabelle. 2) Fügen Sie die Zahlen 1 bis 100 in diese Tabelle ein. 3) SELECT aus der temporären Tabelle und verwenden Sie eine CASE-Anweisung in Ihrer SELECT-Zeile, um die Nummer, Fizz oder FizzBuzz zu drucken.

2

Sie könnten auch versuchen spt_values mit Zahlenfolgen zu erzeugen, wie folgt:

select 
    case when n%3 = 0 and n%5 = 0 then 'FizzBuzz' 
     when n%3 = 0 then 'Fizz' 
     when n%5 = 0 then 'Buzz' 
     else cast(n as varchar(3)) end 
from 
(
select distinct number as n 
FROM master..[spt_values] 
WHERE number BETWEEN 1 and 100) A 
1
SELECT DQ.N, 
    CASE WHEN DQ.N % 3 = 0 then 'Fizz' ELSE '' END + 
    CASE WHEN DQ.N % 5 = 0 then 'Buzz' ELSE '' END  
FROM 
    (SELECT 
    row_number() OVER (ORDER BY @@spid) N 
     FROM sys.objects a, sys.objects b) DQ 
      WHERE DQ.N <=100 
      ORDER BY DQ.N