Простая математика на всю таблицу sqlite - PullRequest
0 голосов
/ 22 июля 2011

Давайте возьмем эту простую таблицу:

CREATE TABLE correlation ( '1' REAL, '2' REAL, '3' REAL)
INSERT INTO correlation VALUES ( 1.0 , -0.4 , 0.6 )
INSERT INTO correlation VALUES ( -0.4 , 1.0 , 0.2 )
INSERT INTO correlation VALUES ( 0.6 , 0.2 , 1.0 )

Теперь хотим создать представление и выполнить простую математическую операцию с ячейками:

CREATE VIEW correlation_codes AS SELECT 
CASE 
WHEN * > 0 THEN 3
WHEN * < 0 THEN 5
WHEN * == 0 THEN 8
WHEN * == 1.0 THEN 4
ELSE 99
END
FROM correlation

Желаемый результат:

 1.0  -0.4  0.6
-0.4   1.0  0.2
 0.6   0.2  1.0

становится:

 4      5     3
 5      4     3
 3      3     4

Я не могу использовать * в CASE, но я хочу один CASE для всей таблицы.

Что мне делать?

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Вы можете создать UDF и пропустить каждый столбец через UDF, чтобы выполнить преобразование.Я думаю, что вы можете использовать UDF в представлении:

           create view myView as
           select udf(col1), udf(col2), udf(col3) ...
           from T
0 голосов
/ 22 июля 2011

Прежде всего, почему вы используете числа (ну, ладно, строки, которые можно напрямую преобразовать в числа) в качестве имен столбцов? Это просто напрашивается на неприятности, особенно в where или group by заявлениях (WHERE '1'>0 выглядит в лучшем случае странно).

Во-вторых, вы правы в том, что вы не можете использовать * в выражении case. Вам нужно будет выполнить оператор case для каждого столбца отдельно и составить таблицу из всех них. Тем не менее, это не работает, когда имена столбцов (по существу) числа:

select case when '1'>0 then 3 when '1'<0 then 5 when '1'==0 then 8 when '1'==1.0 then 4 else 99 end from correlation;

выходы

3
3
3

Вместо этого давайте попробуем разумные имена столбцов:

sqlite> create table correlation2 (c1 real,c2 real,c3 real);
sqlite> insert into correlation2 values (1.0,-0.4,0.6);
sqlite> insert into correlation2 values (-0.4,1.0,0.2);
sqlite> insert into correlation2 values (0.6,0.2,1.0);

Теперь утверждение case дает:

sqlite> select case when c1>0 then 3 when c1<0 then 5 when c1==0 then 8 when c1==1.0 then 4 else 99 end from correlation2;
case when c1>0 then 3 when c1<0 then 5 when c1==0 then 8 when c1==1.0 then 4 else 99 end
3
5
3

Теперь вы хотели, чтобы значения столбца были

4
5
3

Однако, это не то, как работает оператор case: начиная с 1.0> 1, оценивается первая ветвь оператора case (и, следовательно, первая запись присваивается 3, а не 4). Это то, что вы имели в виду?

sqlite> select case when c1>0 and c1!=1 then 3 when c1<0 then 5 when c1==0 then 8 when c1==1 then 4 else 99 end from correlation2;
case when c1>0 and c1!=1 then 3 when c1<0 then 5 when c1==0 then 8 when c1==1 then 4 else 99 end
4
5
3
...