2016-04-13 29 views
0

-1到100在SQL中显示'Fizz'如果数字可以被3整除'Buzz'如果可以被5整除并且'FizzBu​​zz'被两个整除。下面是我的代码Fizz嗡嗡声SQL逻辑错误

select 
Case when Remainder (rownum,3)=0 then 'Fizz' 
    when Remainder (rownum,5)=0 then 'Buzz' 
    when (remainder (rownum,3)=0 and remainder(ROWNUM,5) = 0) then 'FizzBuzz' 
    else rownum end 
from DUAL 
Connect by level <=100; 

它给了我错误 - ORA-00932:不一致的数据类型:预期CHAR了NUMBER 00932. 00000 - “不一致的数据类型:有望%S得了%的” *原因:
*行动: 错误在行:5列:18

+1

投的ROWNUM为VARCHAR2 – Quassnoi

+1

[代码高尔夫球:1,2, Fizz,4,Buzz](http://codegolf.stackexchange.com/a/58969/15968) – MT0

回答

2

您需要通过要么ROWNUM转换为字符串在ELSE情况:

  • CAST(ROWNUM AS VARCHAR2(3))
  • ''||ROWNUM
  • TO_CHAR(ROWNUM)

您还需要这样一种情况,即它可以被3和5整除以排在列表的顶部(否则前面的例子将优先)。就像这样:

SELECT CASE 
     WHEN remainder (rownum,15)=0 THEN 'FizzBuzz' 
     WHEN Remainder (rownum,3)=0 THEN 'Fizz' 
     WHEN Remainder (rownum,5)=0 THEN 'Buzz' 
     ELSE TO_CHAR(rownum) 
     END 
FROM DUAL 
CONNECT BY LEVEL <= 100; 

不过,可以缩短代码有很多(从一个答案我张贴Code Golf拍摄):

SELECT NVL(
     DECODE(MOD(LEVEL,3),0,'Fizz')||DECODE(MOD(LEVEL,5),0,'Buzz'), 
     ''||LEVEL 
     ) 
FROM DUAL 
CONNECT BY LEVEL<101 
+0

非常感谢你让我的一天! –

2

这是在你的其他声明。 Rownum是NUMBER,而Fizz,Buzz和FizzBu​​zz是CHAR。

0
select 
Case when Remainder (rownum,3)=0 then 'Fizz' 
    when Remainder (rownum,5)=0 then 'Buzz' 
    when (remainder (rownum,3)=0 and remainder(ROWNUM,5) = 0) then 'FizzBuzz' 
    else ''||rownum end 
from DUAL 
Connect by level <=100; 

select 
Case when Remainder (rownum,3)=0 then 'Fizz' 
    when Remainder (rownum,5)=0 then 'Buzz' 
    when (remainder (rownum,3)=0 and remainder(ROWNUM,5) = 0) then 'FizzBuzz' 
    else to_char(rownum) end 
from DUAL 
Connect by level <=100; 
+0

由于缺少大小写表达式分支的错误顺序,请勿信用(请参阅MT0的解释答案)。 – mathguy

+1

@mathguy有点苛刻,因为这确实回答了问题的主要焦点'ORA-00932'异常的问题。 – MT0