Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#856: 2011-12-16 17:39:09 ЛС | профиль | цитата
nesco,
A CASE expression serves a role similar to IF-THEN-ELSE in other programming languages.


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#857: 2011-12-16 17:47:25 ЛС | профиль | цитата
Tad, а примерчик запроса есть, на любых фонарных данных
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#858: 2011-12-16 19:15:22 ЛС | профиль | цитата
Где-то тут вроде Alexbootch выкладывал. Там что-то про Дату. Вернее про дни недели.
Вот нашел:
SELECT sum(amount) AS 'Количество', 
(select CASE
WHEN strftime('%w',dt)='0' THEN 'воскресенье'
WHEN strftime('%w',dt)='1' THEN 'понедельник'
WHEN strftime('%w',dt)='2' THEN 'вторник'
WHEN strftime('%w',dt)='3' THEN 'среда'
WHEN strftime('%w',dt)='4' THEN 'четверг'
WHEN strftime('%w',dt)='5' THEN 'пятница'
WHEN strftime('%w',dt)='6' THEN 'суббота'
END) AS 'День недели'
FROM tab1 GROUP BY strftime('%w',dt);

------------ Дoбавленo в 19.15:
Хотя вроде и так можно (проверить надо)
SELECT sum(amount) AS 'Количество', 
(select CASE strftime('%w',dt)
WHEN '0' THEN 'воскресенье'
WHEN '1' THEN 'понедельник'
WHEN '2' THEN 'вторник'
WHEN '3' THEN 'среда'
WHEN '4' THEN 'четверг'
WHEN '5' THEN 'пятница'
WHEN '6' THEN 'суббота'
END) AS 'День недели'
FROM tab1 GROUP BY strftime('%w',dt);
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#859: 2011-12-16 19:24:08 ЛС | профиль | цитата
А вместо значения я могу запрос выставить после THEN
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#860: 2011-12-16 19:57:49 ЛС | профиль | цитата
SELECT tab1.name, (SELECT CASE tab1.id WHEN 1 THEN 1 ELSE 1 END) AS idd , sum(tab2.amount) FROM tab1, tab2 WHERE idd = tab2.idTab1 GROUP BY 1;
или так
SELECT tab1.name, (SELECT CASE WHEN  tab1.id >2 THEN tab1.id-1  END) AS idd , sum(tab2.amount) FROM tab1, tab2 WHERE idd = tab2.idTab1 GROUP BY 1;
Вот для схемки miverhttp://forum.d2h.ru//getfile/26196
Работает.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#861: 2011-12-16 20:05:38 ЛС | профиль | цитата
Tad, а idd это что -- виртуальный столбец
А можно ли присвоить значение некой переменной, мне интресно как это делается
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#862: 2011-12-16 20:08:46 ЛС | профиль | цитата
idd - это и есть переменная с результатом SELECt-а в скобках.
Выше во втором примере то что тебе нужно проверка на - если больше то минус что-то.
в idd (tab1.id-1) если (tab1.id>2)
А можно и так:
SELECT tab1.name, sum(tab2.amount) FROM tab1, tab2 WHERE (SELECT CASE WHEN  tab1.id >2 THEN tab1.id-1  END)  = tab2.idTab1 GROUP BY 1;
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#863: 2011-12-16 20:45:32 ЛС | профиль | цитата
Tad, те этот idd я могу использовать как индекс выборки для следующей таблицы, правильно я понимаю
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#864: 2011-12-16 21:35:52 ЛС | профиль | цитата
но ты не забывай, что idd меняется от строки к строке WHEN tab1.id >2 THEN tab1.id-1
Если ты его запомнишь в программе, то применяй.

А если по честному, то я не понял, что ты имеешь ввиду:
1 писал(а):
использовать как индекс выборки для следующей таблицы
т.е. в одном запросе ?
или для следующего SELECT ?
2 писал(а):
использовать как индекс для следующей выборки из таблицы

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:nesco
Разработчик
Ответов: 26113
Рейтинг: 2126
#865: 2011-12-16 21:46:52 ЛС | профиль | цитата
Да у меня разные варианты возникают по мере чтения, буду проверять разные. Спасибо, что подсказал, хоть теперь знаю, в какую сторону копать надо
------------ Дoбавленo в 21.46:
Tad писал(а):
но ты не забывай, что idd меняется от строки к строке WHEN tab1.id >2 THEN tab1.id-1

Мне нужна разовая выборка из разных таблиц в зависимости от индекса и дополнительного внешнего параметра
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#866: 2011-12-17 12:11:47 ЛС | профиль | цитата
nesco, если ещё интересует загрузка в blob, то загляни сюда (использую при работе в Delphi)
http://forum.antichat.ru/thread135998.html
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#867: 2011-12-17 14:16:47 ЛС | профиль | цитата
Tad писал(а):
если ещё интересует загрузка в blob

Оюязательно гляну. Хотел еще спросить -- назначенная переменная, предположим idd, распространяется только на текущий запрос или на всю транзакцию, те могу ли я ее использовать в следующем последовательном запросе одного элемента
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#868: 2011-12-17 15:56:24 ЛС | профиль | цитата
nesco писал(а):
Хотел еще спросить -- назначенная переменная, предположим idd, распространяется только на текущий запрос
По моему только на текущий.
nesco, ещё есть такой ход
Командой CREATE TABLE ... AS SELECT ....
можно создать и заполнить временную вспомогательную таблицу БД на основе результата SELECT.
Таблица имеет такое же число столбцов, строк, возвращенных AS SELECT.
Имя каждого столбца такое же, как название соответствующего столбца в результирующем наборе AS SELECT.
Применяю часто. Удобно и быстро работает.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#869: 2011-12-17 16:03:01 ЛС | профиль | цитата
Tad писал(а):
Удобно и быстро работает

Надо полагать, что эта промежуточная таблица оформляется в памяти, вот и быстро работает. Но для моей простенькой задачи эта прмежуточная таблица -- слишком круто. К тому же, мне нужно только одно результирующее значение по выбранным параметрам. Я тут готовую схемку накидаю, когда набивку данных закончу, глянешь, может чего ты бы сделал по-другому, интересно будет послушать твое мнение
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#870: 2011-12-17 16:10:50 ЛС | профиль | цитата
Ну да. И ещё учти, что в эту таблицу отбираешь только то, что тебе нужно. Таблица получается "короткая". У меня в пределах 100-200 строк из исходной на полмиллиона записей .
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)