SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.04.2007 00:27:29

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

NOP equivalent in SQL

есть ли в SQL что либо подобное?
просто в конструкции:
CASE expression
        WHEN value THEN
            statements
        [WHEN value THEN
            statements ...]
        [ELSE
            statements]
    END CASE;
нужно обязательно поставить после ELSE какой то оператор, иначе если ни в один WHEN не сработает будет exeption.
можно ли придумать что-нибудь получше чем 'SELECT 0;' ?

Неактивен

 

#2 21.04.2007 01:29:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: NOP equivalent in SQL

Вообще говоря, ELSE можно не писать... но уж если написан, то,
конечно, оператор нужно. NOOP нету.

Неактивен

 

#3 21.04.2007 01:42:45

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: NOP equivalent in SQL

paulus написал:

Вообще говоря, ELSE можно не писать...

я же написал почему нужен этот ELSE:   если ни один WHEN не сработает будет exeption (это без ELSE)
а мне exeption совсем ни к чему.

Неактивен

 

#4 21.04.2007 01:47:23

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: NOP equivalent in SQL

Небольшое дополнение: если не использовать ELSE, и при этом не будет выполнено ни одно из условий WHEN value, то выражение просто вернет NULL (и потом с ним можно работать, например, при помощи функции ISNULL() и других)
Это можно проиллюстрировать примером:

mysql>SET @a = 0;
Query OK, 0 rows affected (0.00 sec)

mysql>SET @b = CASE @a
    -> WHEN 0 THEN '@a is 0'
    -> END;
Query OK, 0 rows affected (0.00 sec)

mysql>SET @a = 1;
Query OK, 0 rows affected (0.00 sec)

mysql>SET @c = CASE @a
    -> WHEN 0 THEN '@a is 0'
    -> END;
Query OK, 0 rows affected (0.01 sec)

mysql>SELECT
    ->   @b AS 'When @a is 0, statement returns',
    ->   @c AS 'When @a = 1, statement returns'
    -> ;
+---------------------------------------+---------------------------------------+
| When @a is 0, statement returns  | When @a = 1, statement returns  |
+---------------------------------------+---------------------------------------+
| @a is 0                                      | NULL                                          |
+---------------------------------------+---------------------------------------+
1 row in set (0.00 sec)

Результаты выражений можно селектить непосредственно (т.е. прямо писать
SELECT  CASE @var_name … )

Если Вам такое решение не подходит, или ответ не совсем на ваш вопрос - опишите вашу задачу подробнее.

Отредактированно LazY (21.04.2007 01:55:05)

Неактивен

 

#5 21.04.2007 11:48:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: NOP equivalent in SQL

Думаю, автор имел в виду следующую ситуацию:

Код:

DELIMITER //
CREATE PROCEDURE A(num int)
  BEGIN CASE num
    WHEN 1 THEN SELECT 'xxx';
    WHEN 2 THEN SELECT 'yyy';
  END CASE;
END//

mysql> CALL A(1)//
+-----+
| xxx |
+-----+
| xxx |
+-----+
1 row in set (0.00 sec)

mysql> CALL A(4)//
ERROR 1339 (20000): Case not found for CASE statement

Действиительно возникает ошибка, а чтобы ее исправить, единственным решением кажется что-то вроде:

Код:

ELSE SELECT NULL;

Неактивен

 

#6 21.04.2007 12:50:36

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: NOP equivalent in SQL

Хм... значит, я не правильно понял вопрос. В таком случае отлично работает

CASE a
  WHEN 1 THEN SELECT 'one';
  WHEN 2 THEN SELECT 'two';
  ELSE BEGIN END;
END CASE;

Следует учесть, что в случае не 1 и не 2 процедура выдаст на 1 SELECT меньше -
с этим надо считаться. Проще, конечно, вариант с SELECT NULL.

Неактивен

 

#7 21.04.2007 19:15:25

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: NOP equivalent in SQL

спасибо за то что вы меня поняли smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson