В PHP, каковы различия между ПУСТЫМ УКАЗАТЕЛЕМ и установкой строки для равенства 2 одинарным кавычкам

Я думаю, это потому, что вы не указали псевдоним для своего подзапроса. Вы также пропускаете группировку во внешнем запросе. Форматирование вашего запроса также может быть улучшено:

select 
  count(a.did),
  a.did  
from ( 
  select 
    count(dh.FileDataId) as fid, 
    dh.documentid as did,
    dh.FileDataId 
  from DocumentHistory dh 
  INNER JOIN Document d on d.documentid = dh.documentid
  where d.DocumentTypeId=11 and d.IsVerified=0 and d.lastmodified < '2019-01-05'  
  group by DocumentId, filedataid 
  having count(FileDataId)<2
) a
GROUP BY did

Помимо включения предложения Саймона относительно формата даты (гггг-мм-дд - это ISO, и не подвержено проблемам локализации, таким как дата, содержащая слова - ваш запрос может не работать, например, с испанской базой данных), я также поменял IN на INNER JOIN; хотя оптимизаторы запросов, как правило, могут переписывать IN так, чтобы он вел себя как объединение, следует стремиться избегать использования IN для списков, которые длиннее, чем вы были бы готовы писать вручную. Некоторые базы данных лучше оптимизированы для объединения, чем в

. Заметим, что существует небольшая разница в поведении между INNER JOIN и IN, если в списке IN (...) есть дубликаты, которых вы не будете получить повторяющиеся строки из результата истории документа, но вы бы с внутренним объединением. (Я ожидаю, что documentmentid является первичным ключом документа, поэтому дубликаты в этом случае не появятся)

28
задан alex 6 July 2017 в 07:39
поделиться

5 ответов

Пустой указатель является просто другим типом данных в PHP, который имеет только одно значение (пустой указатель). , Так как PHP является loosly типизированным языком, это может сбивать с толку, как он обрабатывает различные значения.

"", 0, "0", False, array(), Null все считаются Ложью в PHP.

Пустой указатель, однако, является другим видом животного. основной несовместимость с использованием Пустого указателя состоит в том, что Вы не можете сказать если это isset ().

$x = false;
isset($x)  ->  true
echo $x    ->  ""

$y = null;
isset($y)  ->  false
echo $y    ->  ""

//$z is not set
isset($z)  ->  false
echo $z    ->  E_NOTICE

, Таким образом, пустой указатель нечетен в том смысле, что он не следует нормальным переменным правилам в PHP (по крайней мере некоторые). В большинстве случаев это прекрасно.

Когда дело доходит до столбцов базы данных, ПУСТОЙ УКАЗАТЕЛЬ PHP не имеет никакого места там. Вы видите, SQL является основанным на строке языком. ПУСТОЙ УКАЗАТЕЛЬ SQL должен быть представлен NULL без кавычек.

Поэтому, если Вы хотите поле EMPTY, установите его на""

INSERT INTO foo SET bar = ""

, Но если Вы хотите поле NULL, устанавливаете его на ПУСТОЙ УКАЗАТЕЛЬ

INSERT INTO foo SET bar = NULL

БОЛЬШАЯ РАЗНИЦА.

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

47
ответ дан gahooa 28 November 2019 в 02:41
поделиться

null - это специальное значение заполнителя в языке программирования, которое буквально означает «ничто». Это не 0, это не пустая строка, это ничто. В памяти нет значения, на которое указывают. Пустая строка, с другой стороны, все еще является строковым объектом, просто очень коротким:)

21
ответ дан Rex M 28 November 2019 в 02:41
поделиться

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

2
ответ дан Alexandru Luchian 28 November 2019 в 02:41
поделиться

Кроме различий, указанных Королем, существует два типа сравнений в PHP, свободном и строгом:

http://www.php.net/manual/en/types.comparisons.php

, Если строгие сравнения или функции как is_null () используются в способности, Вы получите различные результаты. Со свободными сравнениями, однако, PHP довольно снисходителен.

я не знаю наверняка, но можно быть в состоянии использовать пустой подход, тогда просто преобразовать тип при использовании переменной в контексте, где у Вас были проблемы (т.е. передача (строка) $blankVar). Если это работает, это может означать, что меньше изменений необходимо для Вашего кода.

2
ответ дан Dan Fego 28 November 2019 в 02:41
поделиться

'null' - это уникальная вещь, на которую ссылаются неинициализированные переменные. Вы можете установить переменную для ссылки на ноль. Существует также состояние «unset», означающее, что переменная вообще не существует. Вы можете проверить это с помощью функции isset () . Чаще всего используется для проверки того, существует ли элемент массива и является, например, способом узнать, получил ли $ _GET ['op'] параметр строки запроса. Вы также можете сделать переменную unset (удалить элемент массива) с помощью функции unset () . Существует также функция empty () , которая проверяет, является ли переменная NULL, FALSE, 0 или пустой строкой

1
ответ дан Scott Evernden 28 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

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