SQL: Почему Нулевые значения отфильтрованы в этом где пункт?

Мой полный файл docker-compose.

version: '3.2'
services:
    apache:
        container_name: apache
        build: .docker/apache/
        restart: always
        volumes:
            - .:/var/www/html/app/
        ports:
            - 80:80
        depends_on:
            - php
            - mysql
        links:
            - mysql:mysql
    php:
        container_name: php
        build: .docker/php/
        restart: always
        volumes:
            - .:/var/www/html/app/
        working_dir: /var/www/html/app/

    mysql:
        container_name: mysql
        image: mysql
        restart: always
        volumes:
            - .docker/data/db:/var/lib/mysql
        environment:
            MYSQL_DATABASE: app
            MYSQL_ROOT_PASSWORD: test
            MYSQL_USER: test
            MYSQL_PASSWORD: test

5
задан Jon Erickson 25 March 2009 в 21:52
поделиться

7 ответов

Из статьи в Википедии о ПУСТОМ УКАЗАТЕЛЕ:

Например, оператор Where или условный оператор могли бы сравнить значение столбца с константой. Часто неправильно предполагается, что отсутствующее значение было бы "меньше, чем" или "не равный" константе, если то поле содержит Пустой указатель, но, на самом деле, такой Неизвестный возврат выражений. Пример ниже:

-- Rows where num is NULL will not be returned,
-- contrary to many users' expectations.
SELECT * FROM sometable WHERE num <> 1;   

В основном любое сравнение между ПУСТЫМ УКАЗАТЕЛЕМ и что-то еще, является ли это с = или <>, не будет верно.

Как другая ссылка, страница MSDN T-SQL на <> состояния:

Сравнивает два выражения (оператор сравнения). При сравнении непустых выражений результатом является TRUE, если левый операнд не равен правильному операнду; иначе результатом является ЛОЖЬ. Если или или оба операнда являются ПУСТЫМИ, посмотрите SET ANSI_NULLS (Transact-SQL).

Страница SET ANSI_NULLS затем указывает:

Когда SET ANSI_NULLS идет, оператор SELECT, который использует, КУДА column_name = ПУСТОЙ УКАЗАТЕЛЬ возвращает нулевые строки, даже если существуют нулевые значения в column_name. Оператор SELECT, который использует, КУДА column_name <> ПУСТОЙ УКАЗАТЕЛЬ возвращает нулевые строки, даже если существуют непустые значения в column_name.

...

Когда SET ANSI_NULLS идет, все сравнения с нулевым значением оценивают к НЕИЗВЕСТНОМУ. Когда SET ANSI_NULLS ВЫКЛЮЧЕН, сравнения всех данных против нулевого значения оценивают к TRUE, если значение данных является ПУСТЫМ.

11
ответ дан 18 December 2019 в 06:04
поделиться

Много хороших ответов, но позволяют мне дать Вам действительно краткую версию.

К SQL Пустой указатель НЕ означает "Значения", это означает "Неизвестное Значение"

Имея это в виду, рассмотрите ответ на вопрос, Вы спрашиваете SQL без обиняков.

Q: Is this unknown value not equal to 1? 
A: I don't know, there is no way to tell without knowing the value.

Hence Null<>1 = Null
12
ответ дан 18 December 2019 в 06:04
поделиться

Другие люди корректны это NULL <> 1 не оценивает как верный, поэтому это не удовлетворяет WHERE пункт.

Предложенная фиксация, которую Вы описываете, является лучшим способом обработать его:

(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)

SQL-99 действительно имеет предикат, который помогает в этом случае, названный IS DISTINCT FROM:

(VoidedIndicator IS DISTINCT FROM 1)

Этот предикат вел бы себя точно то же как Ваша предложенная фиксация. К сожалению, Microsoft SQL Server не поддерживает IS DISTINCT FROM все же.

1
ответ дан 18 December 2019 в 06:04
поделиться

Вы можете также: isnull (VoidedIndicator, 1) <> 1

0
ответ дан 18 December 2019 в 06:04
поделиться

Это не ошибка.

ПУСТОЙ УКАЗАТЕЛЬ ничему не равен, даже ПУСТОЙ УКАЗАТЕЛЬ (ПУСТОЙ УКАЗАТЕЛЬ =, ПУСТОЙ УКАЗАТЕЛЬ возвращает FALSE).

Обычно Нулевые значения не индексируются также. Это обычно - плохая идея полагаться на конкретное значение или ПУСТОЙ УКАЗАТЕЛЬ. В зависимости от того, что Вы храните в столбце, можно быть более обеспеченным помещением макета или значения сигнальной метки во вместо того, чтобы использовать ПУСТОЙ УКАЗАТЕЛЬ для указания на некоторое значение.

3
ответ дан 18 December 2019 в 06:04
поделиться

Поскольку оператор Where только выбирает строки, когда условие оценивает к истинному.

Когда один из операндов является ПУСТЫМ, условие обычно оценивает к НЕИЗВЕСТНОМУ (приблизительно эквивалентный ПУСТОМУ УКАЗАТЕЛЮ) и поэтому не верно. Это относится к обоим'column = 1'и'column <> 1'; если столбец является ПУСТЫМ, сбои условия поиска.

Это - почему Вам говорят избежать столбцов NULL, когда это возможно.

0
ответ дан 18 December 2019 в 06:04
поделиться

ПУСТОЙ УКАЗАТЕЛЬ <> 1 оценивает (теоретически) к, "возможно", что означает, что запись не будет возвращена.

0
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: