2016-08-09 6 views
5

Napisz program, za pomocą języka SQL, która drukuje numery od 1 do 100.Zapis zapytań bez użycia pętli

Ale dla wielokrotności trzech print „Fizz” zamiast numeru i dla wielokrotności pięciu print „Buzz”. W przypadku liczb, które są wielokrotnościami zarówno trzech, jak i pięciu, należy wydrukować "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 

Daje to pożądane wyjście. Ale, proszę, nie używaj pętli, czy można to zrobić w jakikolwiek inny sposób? Co powiesz na używanie CTE?

Odpowiedz

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 

Od tej tabeli, używamy sprawę obliczyć modulo.Read poniżej numery artykułów o tym, dlaczego tabele są przydatne i jak mogą one zastąpić pętle ..

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

Dzięki, trochę wyjaśnienie byłoby bardziej pomocne ... – BlackCat

+1

@Zahid: Dodałem kilka linków i pewne wyjaśnienie, proszę przejść przez nich – TheGameiswar

+0

dzięki. Wiem trochę o CTE, ale cte (n) termin myli mnie. Czy to jest funkcja? – BlackCat

0

1) Utwórz tabelę tymczasową. 2) Wstaw numery od 1 do 100 do tej tabeli. 3) Wybierz z tabeli tymczasowej i użyj instrukcji CASE w linii SELECT, aby wydrukować numer, Fizz lub FizzBuzz.

2

można też spróbować użyć spt_values generować sekwencje liczbowe w następujący sposób:

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