2014-11-24 50 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