sql - TSQL - 不使用循环写入 FIZZBUZZ

标签 sql sql-server

使用 SQL 编写一个程序,打印 1 到 100 之间的数字。

但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于三和五的倍数的数字打印“FizzBu​​zz”

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

这给出了所需的输出。但是,我被要求不要使用循环,是否可以通过其他方式做到这一点?使用 CTE 怎么样?

最佳答案

;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
)
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

从该表中,我们使用大小写来计算模。阅读下面的文章,了解数字表为何有用以及它们如何替换循环。

1.http://dataeducation.com/you-require-a-numbers-table/
2.http://www.sqlservercentral.com/articles/T-SQL/62867/
3.https://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable

关于sql - TSQL - 不使用循环写入 FIZZBUZZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38841684/

相关文章:

sql-server - 如何在 SQL Server 上的 CASE WHEN 中选择多个列?

mysql - 当列存在时查询不同的表

sql - 我想知道哪个表存储事件触发器的触发器的创建语句,例如

sql - 将逗号分隔的列值转换为行

sql - 如何通过T-SQL查找表的特定外键?

sql-server - 将 INFORMATION_SCHEMA.COLUMNS COLUMN_DEFAULT 转换为基础数据类型

javascript - SQL 到 Mongo 事务架构

MySQL JOIN 并从两个可能的来源中选择一个

sql - ntext 数据的 GROUP BY

mysql - sql查找具有不同列值的行