检查输入中的值是否为小数

时间:2013-06-01 17:44:02

标签: stored-procedures sqlanywhere

我正在使用SQLAnywhere学习SQL,我相信它使用相当标准的SQL语法

我的问题是我创建了一个表MatchRecord,其Id为char(4)NOT NULL,得分为十进制,引脚为十进制。

现在我想创建一个过程insert_scores来将值插入表中 我到目前为止:

    create procedure insert_scores(IN play_id char(4), IN play_score decimal(5, 2), 
    IN no_pins decimal(5, 2), OUT a_message varchar(40))

    begin
    if substr(play_id, 1, 1)in (Upper('M','F', 'J'
    then
       if isnumeric(substr(play_id 2, 3)) = 1
       then
          if isnumeric(play_score) = 1
          then
             if isnumeric(no_pins) = 1
             then 
               insert into MatchRecord(id, score, pins)
               values(play_id, play_score, no_pins);
               set a_message = 'Entry successful';
             else
             set a_message = 'Number of pins must be decimal ie, 1.6 ';
             end if;
            else
            set a_message = 'Score must be decimal ie, 9.4 ';
            end if;
         else
         set a_message = 'ID number must be in range 000 to 999 ';
         end if;
   else
   set a_message = 'First character of ID must be M, F of J':
   end if;

这适用于任何一个字符在任何一个十进制值中意外插入,因此系统抛出错误,它似乎在读取if语句之前检查表类型, 我试过isnumeric(string(play_score))= 1但仍然是同样的错误。

有没有办法在第一个if语句之前检查play_score和no_pins中传递的数字是否为小数?

1 个答案:

答案 0 :(得分:0)

您可以尝试将数字转换为字符串,然后检查字符串中是否有点。这样的事情可以解决问题。

DECLARE @number_is_ok BIT

SET @number_is_ok = CASE charindex('.', CAST(play_score as CHAR))
       WHEN 0 THEN 0
       ELSE 1
       END 

然后你可以做一个简单的检查,看看数字是否为十进制数,然后继续使用相应的逻辑。

IF @number_is_ok = 1 ...