В T-SQL < > '?' что-то отличное от данных, не равных знаку вопроса?

Как и все остальные, прежде чем вы сможете использовать $_SERVER['REMOTE_ADDR']; для получения IP-адреса клиента.

Кроме того, если вам нужна дополнительная информация о пользователе, вы можете использовать это:

" . $clientDetails->country . "";
?>

Более подробная информация клиента находится в $ clientDetails. Вы можете получить json-элементы, хранящиеся в переменной $ clientDetails следующим образом: $ clientDetails-> PostalCode / hostname / region / loc ...

Я использую ipinfo.io , чтобы получить Дополнительная информация.

Надеюсь, это поможет.

0
задан Kevin Anderson 15 January 2019 в 16:58
поделиться

2 ответа

Вы правы, полагая, что <> означает «не равно». Что вы упускаете, так это то, что NULL ничего не равно, а также не равно ничему (даже другим значениям NULL). Любое сравнение на равенство с NULL на самом деле оценивается как «Неизвестный», который не совпадает с «Истина» или «Ложь».

NULL = '?' -- evaluates to Unknown
NULL <> '?' -- evaluates to Unknown
NULL = NULL -- evaluates to Unknown
NULL <> NULL -- evaluates to Unknown

Если вы хотите включить NULL записей в свой результат, вам нужно сравнить, используя IS NULL. Измените свои заявления на это:

AND (Address1 <> '?' OR Address1 IS NULL)
AND (Address2 <> '?' OR Address2 IS NULL)
AND (Address3 <> '?' OR Address3 IS NULL)
0
ответ дан mypetlion 15 January 2019 в 16:58
поделиться

<> означает «не равно не», поэтому что-то вроде 'abc' <> 'def' будет оцениваться как TRUE. Однако в отношении NULL вы не можете использовать логические операторы. Использование логического оператора с NULL возвращает результат NULL (фактически неизвестный), что не соответствует действительности; и (чтобы заявить очевидное) предложение верно только в том случае, если оно верно. Итак, в результате что-то вроде 'abc' <> NULL = NULL != TRUE; Это означает, что требования пункта WHERE не выполнены.

Для работы с NULL вам необходимо использовать операторы IS NULL и IS NOT NULL. Итак, для вашего SQL вам понадобится:

AND (Address1 <> '?' OR Address1 IS NULL)
AND (Address2 <> '?' OR Address2 IS NULL)
AND (Address3 <> '?' OR Address3 IS NULL)

(при условии, что вы хотите получить строки с возвращенным NULL).

Как прокомментировал Шон, вы можете обернуть столбцы, например Address1, с помощью функции ISNULL или COALESCE (т.е. ISNULL(Address1,'') <> '?'), однако я рекомендую против этого. Использование этих функций в вашем WHERE сделает ваш запрос не SARGable и в результате может оказать (серьезное) влияние на производительность вашего запроса.

0
ответ дан Larnu 15 January 2019 в 16:58
поделиться