Равенство нулевого столбца - PullRequest
0 голосов
/ 27 августа 2018

У меня есть таблица с именем pat_info.В этой таблице у меня есть столбец id_number, который можно обнулять.Когда я пишу этот запрос:

SELECT *
FROM pat_info
WHERE id_number = id_number
    AND first_name = 'adam'

Он ничего не извлекает, потому что строка 'adam' не содержит значения в id_number

Поэтому мне нужно получить строку 'adam' безудалять.

Id_number = id_number потому что это требуется.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Проще говоря, если ID_NUMBER равен NULL в строке, которую вы пытаетесь получить, вы не сможете получить эту строку, если вы укажете ID_NUMBER = ID_NUMBER в своем запросе.Причина этого заключается в том, что в реляционной базе данных NULL не будет сравниваться как «равный» какому-либо значению, включая NULL.Таким образом, если ID_NUMBER равен NULL, тест ID_NUMBER = ID_NUMBER совпадает с NULL = NULL, и это никогда не вернет TRUE.Любое сравнение, где присутствует NULL по обе стороны от сравнения, возвращает NULL.Вот как это работает.

РЕДАКТИРОВАТЬ

Один из возможных путей решения этой проблемы - переписать запрос следующим образом:

Select *
  from pat_info
  Where (id_number = id_number OR 
         ID_NUMBER IS NULL) and
        first_name = 'adam'

Таким образом, требование использовать ID_NUMBER = ID_NUMBER взапрос удовлетворен, по крайней мере, на мой взгляд.

Спасибо, @TimBiegeleisen.: -)

0 голосов
/ 28 августа 2018

Вы также можете использовать LIKE,

SELECT *
  FROM pat_info
 WHERE '%'||id_number||'%' LIKE '%'||id_number||'%'
   AND first_name = 'adam'

Хотя я не понимаю, почему вы поставили это условие,

id_number = id_number
0 голосов
/ 27 августа 2018

Во-первых, вам не нужно это предложение WHERE, скорее всего.Просто используйте это:

SELECT *
FROM pat_info
WHERE first_name = 'adam';

Причина, по которой ваш текущий запрос может быть неудачным, заключается в том, что если id_number окажется NULL, то проверка id_number = id_number будет неудачной, потому что NULL (семантически означает"notknown") не равно себе.

Если вы должны включить эту фиктивную проверку в предложение WHERE, попробуйте использовать WHERE 1 = 1, то есть это:

SELECT *
FROM pat_info
WHERE first_name = 'adam' AND 1 = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...