Модераторы: skyboy, SamDark
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли так проверять на NULL 
:(
    Опции темы
maxipub
Дата 23.3.2018, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Здравствуйте!

Я привык к PHP, где NULL по сути синоним пустоты. А вот в MySQL, насколько знаю, NULL является более неопределенным значением. Посему хотел уточнить у экспертов, является ли корректной такая конструкция:

Код
IF (table.field, 1, 0)


Где table.field - INT UNSIGNED AI, т.е. целочисленное > 0. Использовать планирую в LEFT JOIN, чтоб получать 1 там, где есть пересечения, и 0 там, где их не будет и мы получим NULL.

Является ли корректной такая конструкция? Т.е. она всегда будет отдавать 0 при table.field = NULL?

Заранее спасибо!
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6798
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 383



Нет, не подойдет. В MySql есть специальный оператор IFNULL 
Зависит,конечно, от места имения оператора...

Это сообщение отредактировал(а) ksnk - 23.3.2018, 16:48


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 23.3.2018, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(ksnk @  23.3.2018,  16:46 Найти цитируемый пост)
IFNULL

Мне нужен 0 для table.field=NULL и 1 (а не table.field) для всех других случаев.

А так:
Код
IF (table.field IS NOT NULL, 1, 0)


Можно?
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6798
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 383



Похоже, что подойдет, нужно пробовать и смотреть 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 23.3.2018, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



ksnk, у меня и первый вариант "шел". smile Я просто помню (если не ошибаюсь) когда-то был у меня запрос, где сравнивался NULL, и он в разных ситуациях возвращал разный результат. Точно детали не помню, но запомнил четко что с NULL в MySQL нужно быть начеку.
PM MAIL   Вверх
Akina
Дата 23.3.2018, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20393
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 449



Код

IF (table.field IS NOT NULL, 1, 0)

полностью эквивалентно простому
Код

(table.field IS NOT NULL)

Только один вызов функции экономится.
Цитата(maxipub @  23.3.2018,  17:45 Найти цитируемый пост)
в MySQL, насколько знаю, NULL является более неопределенным значением

Null в MySQL - это unknown value. Ну или по-русски "фиг знает". Соответственно 
Код

IF (table.field, 1, 0)
при table.field, равном "фиг знает", и значение всего выражения тоже будет "фиг знает".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 27.3.2018, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Код
(table.field IS NOT NULL)

А как тут добавить произвольные значения 1,0 if-else?
PM MAIL   Вверх
Akina
Дата 27.3.2018, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20393
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 449



maxipub, подробнее. ВСЮ задачу, плиз... а то очень трудно догадаться, когда и куда надо добавлять эти 1,0... да и вообще - это два значения через запятую или одно с десятичным разделителем запятая?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 27.3.2018, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, хочу использовать это в запросе вида:

Код
UPDATE t1
INNER JOIN t2 ON cond
INNER JOIN t3 ON cond
LEFT JOIN control ON cond
SET t1.control=IF(control.id IS NOT NULL, 0, 1)


Я не знаю каким термином правильно это назвать. t1.control - некая "избыточная" колонка, которая служит для уменьшения нагрузки на БД. Эти три джойна выполняются примерно за 0,05 сек. Но количество запросов к БД и характеристики железа такие, что 0,05 сек для данного запроса получается очень много. А дальнейшая выборка с условием t1.control - вообще ничего.
PM MAIL   Вверх
Akina
Дата 28.3.2018, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20393
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 449



Ну так
Код

UPDATE t1
INNER JOIN t2 ON cond
INNER JOIN t3 ON cond
LEFT JOIN control ON cond
SET t1.control = (control.id IS NULL)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 28.3.2018, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, TRUE / FALSE в данном случае будут корректно приводиться к 1 / 0 (t1.control INT unsigned)? Я проверил, работает. Но это корректный подход, так можно делать?
PM MAIL   Вверх
Akina
Дата 28.3.2018, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20393
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 449



Цитата(maxipub @  28.3.2018,  10:20 Найти цитируемый пост)
это корректный подход, так можно делать? 

Это ДОКУМЕНТИРОВАНО.
Цитата(https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html)

the values TRUE and FALSE are merely aliases for 1 and 0, respectively



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 30.3.2018, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 514
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, спасибо!

Цитата(maxipub @  27.3.2018,  16:50 Найти цитируемый пост)
Я не знаю каким термином правильно это назвать. t1.control - некая "избыточная" колонка, которая служит для уменьшения нагрузки на БД.

Не устроите ли маленький ликбез? Как все же корректно называется такая колонка (если такое название есть)?
PM MAIL   Вверх
Akina
Дата 30.3.2018, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20393
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 449



Цитата(maxipub @  30.3.2018,  12:13 Найти цитируемый пост)
Как все же корректно называется такая колонка (если такое название есть)? 

Есть понятие предварительного расчёта (предрасчёта).
Есть понятие переопределённых данных.
А вот отдельного термина для такого поля - увы, я не ведаю.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Google
  Дата 20.5.2019, 12:54 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1614 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.