2013-08-08 4 views
2

Я хотел сделать OR на булевом столбце в совокупности функции group by и, логически, я выбрал Max функцию для этого. Но я узнал, что TRUE < FALSE в MS Access! Кажется, что MS Access является псевдонимом TRUE до -1 вместо 1.ИСТИНА <ЛОЖЬ в доступе MS?

Я попробовал то же самое в MySQL, кажется, работает нормально:

mysql> select if(TRUE > FALSE, 1, 0); 
+------------------------+ 
| if(TRUE > FALSE, 1, 0) | 
+------------------------+ 
|      1 | 
+------------------------+ 

Почему? Почему доступ к данным здесь нарушил норму SQL?

+3

http://stackoverflow.com/a/8827633/1324019 – Mansfield

+0

Я не думаю, что существует какая-либо норма SQL относительно сопоставления булевых значений с целыми значениями. –

+3

Вы говорите о Microsoft Access, почему вы ожидаете какого-либо поведения, совместимого со стандартами;) –

ответ

1

Да в MSAccess Значение true равно -1.

Это может иметь что-то делать с его Visual Basic корни (в VB -1 верно, чтобы помочь это Битовые операторы делают двойную работу в качестве логических операторов), но я не был бы так удивлен, MSAccess ломает многие много Нормы SQL.

2

От This answer:

Двоичное представление ЛОЖЬ 0000000000000000. Если выполнить операцию NOT (в машинном коде) к нему, он будет изменен на 1111111111111111, но это двоичное представление 16-разрядное целое число со знаком -1.

Изменение знака числа происходит путем инвертирования всех бит и добавления 1. Это называется «дополнением двух».

Сменить знак 1111111111111111. Первый инвертировать; мы получаем: 0000000000000000

Затем добавьте один: 0000000000000001, это 1.

Это доказательство того, что 1111111111111111 был двоичная -1.

+0

Ну, я не думаю, что это объяснение, потому что, например, в 'C','! 0 == 1', а не '11111111'. Таким образом, 'НЕ' в Access мог быть реализован как'! ', А не как поразрядный' NOT'. Я думаю, что это просто сломанный дизайн. – TMS

+0

В любом случае, почему они не использовали типы unsigned? Тогда TRUE может быть '11111111' и в то же время'> FALSE'. – TMS

+1

«Во всяком случае, почему они не использовали неподписанные типы»? Поскольку он построен на среде исполнения VB, а среда исполнения VB не имеет неподписанных типов. «Но когда не было VB Runtime ...» Я не знаю, это было плохое решение, которое укусил меня в задницу не раз, я могу вам сказать :( –

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