2015-03-15 2 views
0

Я нахожу, что, когда я пытаюсь выбрать столбец в выражении case SQL, он не работает, если я не оберну его в числовую функцию. Кажется, что max (цена) выбирает значение в столбце, а только цена, или price всегда возвращает пустое.Выберите подзапрос внутри этого случая, когда оператор, ошибка sqlite?

Я думаю, что это ошибка.

Это не работает:

SELECT 
auction, 
CASE WHEN auction='1' 
    THEN (select max(bid.amount) from bid where bid.auction_id = auction.id) 
    ELSE price 
END as price_string 
FROM product 

Это работает:

SELECT 
auction, 
CASE WHEN auction='1' 
    THEN (select max(bid.amount) from bid where bid.auction_id = auction.id) 
    ELSE max(price) 
END as price_string 
FROM product 

Edit: фиксированной запятой.

+0

Одно различие я вижу дополнительный запятая вы разместили в первом после 'price_string' ... который выглядит неправильно для меня. Но вы не указываете, что это означает, когда вы говорите «это не работает», поэтому это затрудняет устранение неполадок. – Marc

+0

Эти два запроса ведут себя совершенно по-другому из-за агрегатной функции. Покажите некоторые примеры данных и желаемый результат. –

+0

Ах, когда я говорю, что это не сработает, я имею в виду, что он возвращает пустое, а не то, что запрос терпит неудачу. А также цена столбца находится на самой таблице, что означает, что у нее есть только одно возможное значение для каждой строки; это не набор. – thouliha

ответ

2

Это не ошибка.

В запросе, который не работает, две половины вашего оператора CASE несовместимы. У вас есть сводная функция (MAX(bid.amount)), которая возвращает одно значение для одной части вашего оператора CASE и имя столбца, который вернет набор, для другой части вашего оператора CASE. Вы не можете смешивать агрегаты и наборы, подобные этому.

Выполняемый запрос делает так, потому что обе половины оператора CASE возвращают агрегированные значения и поэтому совместимы.

Возьмите простую таблицу:

test_table 
col1 | col2 
1  7 
5  14 
8  3 
3  9 

Если я запрос так:

SELECT col1 FROM test_table 

я получить этот результат, набор:

col1 
1   
5   
8  
3 

Но если я запрашиваю например:

SELECT MAX(col1) FROM test_table 

я получить одно значение:

8 
+0

Я все еще немного смущен. Этот столбец с именем price, находится на самой таблице, что означает, что он имеет только одно возможное значение для каждой строки. Это не набор. – thouliha

+1

Да, одно значение для каждой строки, и оно возвращает это значение для каждой строки и, следовательно, является множеством.Когда вы используете 'MAX', он не возвращает' MAX' для каждой строки (это не имеет смысла), оно возвращает строки 'MAX' of * all *, поэтому оно возвращает только одно значение. –

+0

Итак, позвольте мне понять это: когда вы выберете, он выбирает только одно значение для каждой строки, но если в выражении case он имеет каждую таблицу, доступную? – thouliha

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