Апдейт, попроще

Kino

Новичок
Таблица
ID (int) I Activ(int)

1 1
2 0
3 1
... .....
Гетом скрипт получает значение ID, Можно ли за один заход поменять значение поля Activ. (1 на 0 или 0 на 1) Или все таки надо делать два запроса. Т.е первый раз определяем что там стоит, а второй раз меняем.
Спасибо
 

phprus

Moderator
Команда форума
Уважаемые господа, а кто вам сказал, что в поле Activ не может быть ничего кроме 0 и 1?
Даже не смотря на то, что по нормальному такое поле должно быть ограничено CHECK'ом по диапазону 0,1 нагляднее использовать здесь условное выражение, что-бы потом не возникало вопроса а что-же это такое и как оно работает (особенно с XOR).
 

phprus

Moderator
Команда форума
— кстати, очень даже стандартный приём. Ориентироваться на всякого невежду тоже не стоит.
В ассемблере да, в высокоуровневых языках нет.

Я встречал БД, где в качестве логического поля использовался CHAR(1) со значениями 'Y' и 'N' (Oracle), и как в данном случае решать точно такую-же задачу?
ИМХО надо стремиться к тому, что-бы одинаковые действия выполнялись одинаковыми алгоритмами, а не писать узкоприминимую оптимизацию, от которой не факт что будет польза, а вот негатив очевиден.
 

Вурдалак

Продвинутый новичок
Я встречал БД, где в качестве логического поля использовался CHAR(1) со значениями 'Y' и 'N' (Oracle), и как в данном случае решать точно такую-же задачу?
— давай будем решать проблемы по мере их поступления, а не высасывать их из пальца. Лично я бы не стал вообще подобный флаг делать ENUM'ом или, тем более, CHAR'ом.

узкоприминимую
— негодую!

P.S.
Код:
CHAR(167 - ORD(`active`))
;)
 

phprus

Moderator
Команда форума
Хватит нести бред. Это тема про mysql запрос. Нет тут никакого ассемблера.
Переформулируем вопрос. Использование побитовой арифметики там, где требуется использовать логические операции это норма для SQL? А для программирования вообще?
А есть ли другие аргументы за применение побитовой арифметики в SQL, кроме оскорбления в адрес неопределенного круга лиц ("Ориентироваться на всякого невежду тоже не стоит")?
Принцип KISS еще никто не отменял.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Не надо его переформулировывать. Есть конкретная нормальная задача, которая быстро и без негативных последствий решается конкретным инструментом. Зачем что то придумывать?
 

phprus

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

Негативные последствия это снижение читаемости решения, уменьшение его универсальность и непереносимость запроса. Оператора XOR для чисел нет ни в Oracle ни в PostgreSQL. Это еще раз подтверждает мою точку зрения, что это решение не является стандартным.
 

Вурдалак

Продвинутый новичок
Если уж на то пошло, то я употребил не побитовый оператор, а логический.

Если некоторых современных «программистов» XOR вводит в ступор, то это их проблемы. (сразу вспомнился вопрос triumvirat'а о том зачем в JavaScript нужна работа с восьмеричной системой счисления...).

Негативные последствия это снижение читаемости решения, уменьшение его универсальность и непереносимость запроса
— как будто побочные действия каких-то витаминок прочитал. ;)

P.S. Кстати, в Oracle и PostgreSQL есть IF() с точно таким же синтаксисом? Или может быть это даже в стандарте каком есть? Не пониманию этой дрочки на IF().
 

phprus

Moderator
Команда форума
Если уж на то пошло, то я употребил не побитовый оператор, а логический.
Тогда отчасти виноват. Наследие С приводит к мысли, что xor - оператор побитовый, а про его логические корни я как-то забыл.

Если некоторых современных «программистов» XOR вводит в ступор, то это их проблемы.
В ступор то не вводит, но заставляет вспоминать что это, так как он не так часто применяется.

P.S. Кстати, в Oracle и PostgreSQL есть IF() с точно таким же синтаксисом? Или может быть это даже в стандарте каком есть? Не пониманию этой дрочки на IF().
Конечно есть, называется
Код:
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
 
Сверху