Задавайте вопросы, мы ответим
Вы не зашли.
есть ли в SQL что либо подобное?
просто в конструкции:
CASE expression
WHEN value THEN
statements
[WHEN value THEN
statements ...]
[ELSE
statements]
END CASE;
нужно обязательно поставить после ELSE какой то оператор, иначе если ни в один WHEN не сработает будет exeption.
можно ли придумать что-нибудь получше чем 'SELECT 0;' ?
Неактивен
Вообще говоря, ELSE можно не писать... но уж если написан, то,
конечно, оператор нужно. NOOP нету.
Неактивен
paulus написал:
Вообще говоря, ELSE можно не писать...
я же написал почему нужен этот ELSE: если ни один WHEN не сработает будет exeption (это без ELSE)
а мне exeption совсем ни к чему.
Неактивен
Небольшое дополнение: если не использовать 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)
Неактивен
Думаю, автор имел в виду следующую ситуацию:
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;
Неактивен
Хм... значит, я не правильно понял вопрос. В таком случае отлично работает
CASE a
WHEN 1 THEN SELECT 'one';
WHEN 2 THEN SELECT 'two';
ELSE BEGIN END;
END CASE;
Следует учесть, что в случае не 1 и не 2 процедура выдаст на 1 SELECT меньше -
с этим надо считаться. Проще, конечно, вариант с SELECT NULL.
Неактивен
спасибо за то что вы меня поняли
Неактивен