2014-11-24 138 views
2

AIM:简单的程序;当我的变量被分成3时,返回单词'hip',当它被分成5时,它返回'跳跃',当它被分成3个时,它返回两个单词。CASE语句加模(%)

DECLARE @Zmienna AS INT 
SET @Zmienna = 0 

WHILE @Zmienna < 999 
BEGIN 
    PRINT @Zmienna + 
     CASE 
      WHEN @Zmienna/3=% THEN ' hip' 
      WHEN @Zmienna/5=% THEN ' hop' 
     END 
    SET @Zmienna = @Zmienna + 1 
END 

错误

ERROR: Msg 156, Level 15, State 1, Line 8 
Incorrect syntax near the keyword 'THEN'. 
Msg 102, Level 15, State 1, Line 12 
Incorrect syntax near 'END'. 

任何想法?

+0

这是功课?无论如何,模运算符是'%',而不是'/'。要检查模数是否为0,您需要编写'@ Zmienna%3 = 0' – 2014-11-24 08:07:41

回答

2

试试这个:

DECLARE @Zmienna AS INT 
SET @Zmienna = 0 

WHILE @Zmienna < 999 
BEGIN 
    PRINT CAST(@Zmienna as varchar) + 
     CASE 
      when (@Zmienna%3=0 AND @Zmienna%5=0) THEN ' hip hop' 
      WHEN @Zmienna%3=0 THEN ' hip' 
      WHEN @Zmienna%5=0 THEN ' hop' 

     END 
    SET @Zmienna = @Zmienna + 1 
END 
+3

这将打印'hip'或'hop',但不会同时打印。 – 2014-11-24 08:09:04

+0

@TI是啊......现在更新了 – 2014-11-24 08:20:05

6

我会用模的剩余部分(像你试过)以及将两者连接起来的case语句(否则你将永远不会得到hiphop如果这两个条件都为真)。你也需要else ''否则你可以得到null值:

CASE 
WHEN @Zmienna % 3 = 0 
THEN ' hip' 
ELSE '' 
END 
+ 
CASE 
WHEN @Zmienna % 5 = 0 
THEN ' hop' 
ELSE '' 
END 

提示:如果你想有一个空格或其他一些文本,如果两个条件都true,你必须在case语句使用一个and

CASE 
WHEN @Zmienna % 3 = 0 and @Zmienna % 5 = 0 
THEN ' hip hop' 
WHEN @Zmienna % 3 = 0 
THEN ' hip' 
WHEN @Zmienna % 5 = 0 
THEN ' hop' 
END 
+1

为了说明两种检查都正确的情况,只需在其他情况下放置'WHEN(@Zmienna%3 = 0 AND @Zmienna%5 = 0)'。 – 2014-11-24 08:09:40

+0

@PanagiotisKanavos:这是一个很好的建议。如果你需要“臀部(空间)跳跃”,情况就是这样。如果你只是想'嘻哈',没有必要。 – 2014-11-24 08:10:34

+0

@PanagiotisKanavos:编辑答案。 – 2014-11-24 08:12:03

1

试试这个,它会给你只有1个数据集而不是999,以获得更好的性能和可读性。

打印只能处理1倍的值,而是可以选择在1全力以赴行,并显示在不同列中的值,而不是concatinating其中:

;WITH CTE as 
(
    SELECT 0 Zmienna 
    UNION ALL 
    SELECT Zmienna + 1 
    FROM CTE 
    WHERE Zmienna < 998 -- i wonder why you don't want to include 999 
) 
SELECT 
    Zmienna, 
    CASE 
    WHEN Zmienna % 15 = 0 THEN 'hiphop' 
    WHEN Zmienna % 3 = 0 THEN 'hip' 
    WHEN Zmienna % 5 = 0 THEN 'hop' 
    END as Hippityhop 
FROM CTE 
OPTION (maxrecursion 0) 
+0

如果这是家庭作业,OP将不得不解释解决方案及其好处。 – 2014-11-24 08:34:13

+0

@PanagiotisKanavos寻求家庭作业的帮助可能会更好,所以老师不会教你坏习惯。但我同意它应该相应标记。 – 2014-11-24 08:51:37

0

可以用IF声明

DECLARE @Zmienna AS INT 
SET @Zmienna = 0 

WHILE @Zmienna < 999 
BEGIN 
    if (@Zmienna % 3) = 0 and (@Zmienna % 5) = 0 
BEGIN 
PRINT convert(varchar(10),@Zmienna)+ ' hip'+' '+'hop' 
END 
ELSE 
BEGIN 
if (@Zmienna % 3) = 0 
BEGIN 
PRINT convert(varchar(10),@Zmienna)+' hip' 
END 
if (@Zmienna % 5) = 0 
BEGIN 
select convert(varchar(10),@Zmienna)+' hop' 
END 
END 
    SET @Zmienna = @Zmienna + 1 
END 
+1

这根本不回答问题。迭代缺失,并且多个'IF'对'CASE'的改进无论如何 – 2014-11-24 08:35:05

+0

修复它。你现在可以尝试。 – 2014-11-24 09:45:23

0

这似乎是最简单的答案:

DECLARE @Zmienna AS INT SET @Zmienna = 0

WHILE @Zmienna BEGIN PRINT CAST(@Zmienna为varchar)+ CASE 时(@ Zmienna%3 = 0 AND @ Zmienna%5 = 0)THEN '嘻哈' WHEN @ Zmienna% 3 = 0 THEN '髋' WHEN @ Zmienna%5 = 0 THEN '跳' ELSE ''

END 
SET @Zmienna = @Zmienna + 1 

END