2016-02-26 5 views
0

Как я могу вернуть несколько значений из оператора IF в MySQL? Включение IF в запрос не является вариантом.MySQL IF возвращает несколько значений?

SET @values = IF(@year = 2014, (2, 3, 4), 1); # either (2, 3, 4) OR 1 
SELECT * FROM whatever WHERE `column` IN (@values); 

Код ошибки: 1241. Операнд должен содержать 1 колонку (ы)

Одним из решений было бы использовать кавычки и хранить это значение переменной, но она не работает с команда IN, она нуждается в сырье номера:

SELECT IF (24 IN ("23,24,25"), TRUE, FALSE) AS `does-it-contain`; 

FALSE

+0

Существует не простой, элегантный способ делать то, что вы хотите. 'find_in_set()', пожалуй, самый простой, но он не имеет лучшей производительности. Динамический SQL - самый быстрый метод, но он не изящный. –

+0

Переменная может содержать только одно значение. SQL не имеет массивов или списков в качестве значений. – Barmar

+0

* «Внедрение IF в запрос не является вариантом». * Почему бы и нет? Что относительно 'SELECT * FROM t1 WHERE (@year = 2014 AND c1 IN (2,3,4)) ИЛИ (@year! = 2014 AND c1 IN (1))'? Условие, которое невозможно, должно быть автоматически оптимизировано, что делает этот стиль столь же эффективным. –

ответ

1

Если вы делаете это в процедуре (хранимой процедуре MySQL или на клиентском языке программирования), вы можете использовать временную таблицу.

CREATE TEMPORARY TABLE temp_values (value INT, PRIMARY KEY value); 
IF @year = 2014 
THEN INSERT INTO temp_values VALUES (2), (3), (4); 
ELSE INSERT INTO temp_values VALUES (1); 
END IF; 
SELECT w.* FROM wherever AS w 
JOIN temp_values AS v ON v.column = v.value; 
+0

Есть ли способ сделать это, не используя временную таблицу, потому что она занимает много памяти и время поиска также увеличится. Кроме того, будет ли он работать, когда несколько пользователей пытаются получить доступ к данным через определенный промежуток времени? – proprius

+0

Временные таблицы являются частными для каждого подключения к базе данных, поэтому вы можете сделать это одновременно с несколькими пользователями. Если бы я мог подумать о способе сделать это без стола, я бы разместил это. Вы можете использовать 'ENGINE = MEMORY' для таблицы, чтобы сократить время поиска. Если это всего лишь небольшое количество таких значений, это не займет много памяти. – Barmar

Смежные вопросы