2017-01-11 6 views
0

Я хотел бы написать запрос в MYSQL, который имеет следующий вид:Как я могу повторять инструкции CASE в SQL?

SELECT *, 
    CASE 
     WHEN <column name> = 1 THEN 1 
     ELSE 0 
     END as "column_1", 
    CASE 
     WHEN <column name> = 2 THEN 1 
     ELSE 0 
     END as "column_2", 
    CASE 
     WHEN <column name> = 3 THEN 1 
     ELSE 0 
     END as "column_3" 
    FROM <table name>; 

Я хотел бы записать этот запрос в большом количестве случаев (около 1000 случаев), таким образом, что 1000 новых столбцов которые удовлетворяют указанным выше условиям. Как я могу повторить этот процесс в mySQL, так что мне не нужно писать каждую строку вручную, как я сделал выше (где всего 3 случая)?

+0

Вы выполняете свои итерации в хранимой процедуре или внешней скриптовой программе, чтобы динамически писать SQL для вас. После написания, вы выполняете динамически созданный оператор sql. – JNevill

+0

Создайте текст выше, используя любой язык сценариев, MySql сделает. – Serg

+0

Немного не по теме: Булевы выражения неявно оцениваются до 0 или 1, что означает 'WHEN = 1 ТОГДА 1 ELSE 0 END' можно свести к простому' = 1'. Кроме того, имена полей обычно окружены обратными окнами, а не двойными кавычками. – shmosel

ответ

0

Это не может быть целесообразным, но если вы можете жить с одной колонкой вывода (в виде строки, а не в виде нескольких столбцов), то вы можете быть в состоянии сделать следующее:

select t.id, 
     group_concat((case when t.column = v.value then '1' else '0' end) order by v.ordering) as string_flags 
from (select 1 as ordering, 1 as value union all 
     select 2, 2 union all 
     . . . 
    ) v cross join 
    t 
group by t.id; 

Это просто идея. Производительность - это проблема, но она также затрагивает проблемы с максимальным количеством столбцов в строке.