Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос всегда выдает NULL / 25 сообщений из 26, страница 1 из 2
16.03.2016, 10:34:53
    #39192997
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
(SELECT IF(cr2.remains_time IS NULL, 
              IF(cr.weight_brutto_remains = 0, NULL, CURTIME()), 
              cr2.remains_time) 
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time
ORDER BY cr2.remains_time 
LIMIT 1) AS remains_time_next


Это часть другого запроса, и IF сверху решает, что в случае результата NULL надо выводить текущее время. Однако при любом раскладе все равно получается NULL, т.к. если запрос не находит строк, то просто не срабатывают IF-ы, а сразу выдает NULL, как то, что строки не найдены.
Как сделать, чтобы в случае ненахождения строк выдавал результат, определяемый IF-ами?
...
Рейтинг: 0 / 0
16.03.2016, 10:43:59
    #39193011
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvladКак сделать, чтобы в случае ненахождения строк выдавал результат, определяемый IF-ами?
Так в результирующем наборе же нет записей... в чём тебе возвращать этот самый не-NULL?
...
Рейтинг: 0 / 0
16.03.2016, 10:44:45
    #39193012
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvlad,

а что за объект cr ?
...
Рейтинг: 0 / 0
16.03.2016, 10:46:02
    #39193015
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
А если надо получить скаляр, то тупо
Код: sql
1.
COALESCE( (твой запрос), CURTIME()) AS remains_time_next
...
Рейтинг: 0 / 0
16.03.2016, 10:47:09
    #39193017
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
AkinasvnvladКак сделать, чтобы в случае ненахождения строк выдавал результат, определяемый IF-ами?
Так в результирующем наборе же нет записей... в чём тебе возвращать этот самый не-NULL?
Этот подзапрос возвращает время окончания фрагмента времени. Если строк нет, значит еще не прописано последнее время последнего фрагмента, и нужно вернуть текущее время.
Задача - в случае отсутствия строк запроса вернуть текущее время.
...
Рейтинг: 0 / 0
16.03.2016, 10:51:24
    #39193024
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
AkinaА если надо получить скаляр, то тупо
Код: sql
1.
COALESCE( (твой запрос), CURTIME()) AS remains_time_next


Я пытался запихать подзапрос внутрь другого выражения, выдает ошибку.
...
Рейтинг: 0 / 0
16.03.2016, 10:53:02
    #39193029
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvladЗадача - в случае отсутствия строк запроса вернуть текущее время.сделайте через MIN()
...
Рейтинг: 0 / 0
16.03.2016, 11:03:19
    #39193043
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftsvnvlad,

а что за объект cr ?
cargo_remains внешнего запроса.
...
Рейтинг: 0 / 0
16.03.2016, 11:04:19
    #39193044
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftsvnvladЗадача - в случае отсутствия строк запроса вернуть текущее время.сделайте через MIN()
Не понял.
...
Рейтинг: 0 / 0
16.03.2016, 11:08:28
    #39193049
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
AkinaА если надо получить скаляр, то тупо
Код: sql
1.
COALESCE( (твой запрос), CURTIME()) AS remains_time_next


Ошибки не выдало, но теперь показывает 0000-00-00.
А там же еще одно внутренне условие - IF(условие, NULL, CURTIME()).
Его как обработать?
В общем смысл такой:
/* Следующее время уменьшения груза. Если NULL и остался груз, то текущее время. */
/* Если NULL и нет груза, то NULL */
...
Рейтинг: 0 / 0
16.03.2016, 11:15:45
    #39193067
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
Вся логика того, что ты тут рассказываешь, свидетельствует о том, что подзапрос тебе нахрен не нужен. Избавься от него, введи получение требуемого значения в текст основного запроса.
...
Рейтинг: 0 / 0
16.03.2016, 11:28:53
    #39193089
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvladmiksoftпропущено...
сделайте через MIN()
Не понял.
Код: sql
1.
2.
3.
4.
(SELECT IFNULL(MIN(cr2.remains_time), CURTIME())
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time)
...
Рейтинг: 0 / 0
16.03.2016, 11:30:48
    #39193091
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
AkinaВся логика того, что ты тут рассказываешь, свидетельствует о том, что подзапрос тебе нахрен не нужен. Избавься от него, введи получение требуемого значения в текст основного запроса.
Каким это образом интересно, если в одном запросе надо получить два значения - текущую строку таблицы и следующую?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT ....,
.......
cr.remains_time, /* Предыдущее время */

(SELECT cr2.remains_time
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time
ORDER BY cr2.remains_time 
LIMIT 1) AS remains_time_next, /* Следующее время */
..........
FROM cargo_remains cr
......
...
Рейтинг: 0 / 0
16.03.2016, 11:32:13
    #39193093
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvladв одном запросе надо получить два значения - текущую строку таблицы и следующую
Используй две копии таблицы в основном запросе. Ты их всё равно две используешь.
...
Рейтинг: 0 / 0
16.03.2016, 11:36:23
    #39193099
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftsvnvladпропущено...

Не понял.
Код: sql
1.
2.
3.
4.
(SELECT IFNULL(MIN(cr2.remains_time), CURTIME())
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time)


Да, можно.
Но что в моем варианте, что здесь аномалия какая-то происходит. В случае отсутствия строк запроса выдает не текущее время, а 0000-00-00 00:00:00.
Если MIN(cr2.remains_time) меняю на MIN(cr2.id), то выдает текущее время.
...
Рейтинг: 0 / 0
16.03.2016, 11:39:00
    #39193103
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoft
Код: sql
1.
MIN(cr2.remains_time)

Для отладки выведите MIN(cr2.remains_time)
...
Рейтинг: 0 / 0
16.03.2016, 11:47:00
    #39193113
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftmiksoft
Код: sql
1.
MIN(cr2.remains_time)

Для отладки выведите MIN(cr2.remains_time)
и MIN(cr2.remains_time), и MIN(cr2.id) выдают NULL.
...
Рейтинг: 0 / 0
16.03.2016, 11:50:44
    #39193117
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvlad,

А если так:
Код: sql
1.
IFNULL(MIN(cr2.remains_time), '2017-01-01 01:01:01')

(ну то есть написать дату, которой гарантированно нет в таблице.)
...
Рейтинг: 0 / 0
16.03.2016, 11:52:46
    #39193121
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftsvnvlad,

А если так:
Код: sql
1.
IFNULL(MIN(cr2.remains_time), '2017-01-01 01:01:01')

(ну то есть написать дату, которой гарантированно нет в таблице.)
Тогда выдает '2017-01-01 01:01:01'
...
Рейтинг: 0 / 0
16.03.2016, 11:55:40
    #39193124
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoft,

Почитал доку IFNULL, что-то она мне не нравится.
На всякий случай попробуйте так:
Код: sql
1.
2.
3.
4.
(SELECT CASE WHEN MIN(cr2.remains_time) IS NULL THEN CURTIME() ELSE MIN(cr2.remains_time) END)
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time)
...
Рейтинг: 0 / 0
16.03.2016, 11:56:25
    #39193126
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
Akinasvnvladв одном запросе надо получить два значения - текущую строку таблицы и следующую
Используй две копии таблицы в основном запросе. Ты их всё равно две используешь.
И как связать первую с текущим значением, а вторую со следующим?
...
Рейтинг: 0 / 0
16.03.2016, 11:57:57
    #39193130
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvlad,

О, разглядел, у вас CURTIME, а нужно CURDATE. Дата же какая-то тоже должна быть?
...
Рейтинг: 0 / 0
16.03.2016, 12:00:37
    #39193133
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftmiksoft,

Почитал доку IFNULL, что-то она мне не нравится.
На всякий случай попробуйте так:
Код: sql
1.
2.
3.
4.
(SELECT CASE WHEN MIN(cr2.remains_time) IS NULL THEN CURTIME() ELSE MIN(cr2.remains_time) END)
FROM cargo_remains cr2 
WHERE cr2.cargo_card_id = cr.cargo_card_id
AND cr2.remains_time > cr.remains_time)


(скобка лишняя после END)
Но то же самое выдает. 0000-00-00
...
Рейтинг: 0 / 0
16.03.2016, 12:02:41
    #39193137
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
miksoftsvnvlad,

О, разглядел, у вас CURTIME, а нужно CURDATE. Дата же какая-то тоже должна быть?
Спасибо! А я думал CURTIME выдает и дату, и время. Да, дата тоже должна быть. А как тогда? CURDATE() + CURTIME()?
...
Рейтинг: 0 / 0
16.03.2016, 12:05:05
    #39193141
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос всегда выдает NULL
svnvlad,

SYSDATE() или NOW()
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос всегда выдает NULL / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]