我的SSMS代码如下:
Select top(50)
From FilteredContact
Where statuscode = 1
and emailaddress1 != 'NULL'
and telephone1 != 'NULL'
and address1_line1 != 'NULL'
我意识到理想情况下,最后三行的格式如下:
and emailaddress1 IS NOT NULL
and telephone1 IS NOT NULL
and address1_line1 IS NOT NULL
然而,我的原始代码实际上完全正常。这是为什么?我认为NULL是一个未知值,而不是等于' NULL'
的字符串值如果有人知道,我将非常感谢您的解释!感谢。
答案 0 :(得分:0)
我在猜测
SET ANSI_NULLS OFF
或者其他人建议将NULL
存储为字符串。
答案 1 :(得分:0)
emailaddress1
将'NULL'
与字符串'NULL'
进行比较。由于该字段几乎肯定是一个字符串,所以类型匹配得足够好。由于没有人会有'NULL'
的电子邮件地址,因此比较不会消除有效行(包含非空,但也包括非NULL
值)。
当事物的值实际为UNKNOWN
时,事情变得不那么直观。在标准SQL中,几乎与空值进行任何比较的结果是NULL
(通常将其视为与'NULL'
相同)。由于DBMS仅返回条件为true的行,因此不会返回该行。
因此比较有效,除非字符串ANSI_NULL
在该字段中有效。
答案 2 :(得分:0)
这不涉及!='NULL'
(我不认为)。您正在尝试匹配where子句中的字符串。当您查找NULL
时,您要求SSMS返回任何不是字符串“NULL”的内容。由于NULL
是未知的,并且与它的所有比较都是DECLARE @testing TABLE (ID INT, items VARCHAR(100))
INSERT INTO @testing (ID, items)
VALUES
(1,'blah'),
(2,'blahhhhhh'),
(3,'NULL'),
(4,NULL)
SELECT *
FROM @testing
--will return values that are NOT the string 'NULL' and values that are not NULL
--because NULL compared to anything is NULL
SELECT *
FROM @testing
WHERE items != 'NULL'
SELECT *
FROM @testing
WHERE items <> 'NULL'
--will return all string values that have a non-NULL value
SELECT *
FROM @testing
WHERE items IS NOT NULL
,因此它只返回其他有效字符串。
<div class="grid-container">
<div class="grid-x grid-padding-x contents">
<div class="large-6 cell">
<!-- Upload file -->
<h1 class="page-title">Add a new file to the storage</h1>
<fieldset>
<legend>Add a new file to the storage</legend>
<form method="post" action="index.php" enctype="multipart/form-data" class="upload-form">
<div class="file-input">
<input type="file" name="file" id="file-3" class="inputfile inputfile-3" data-multiple-caption="{count} files selected" multiple
/>
<label class="upload-form-label" for="file-3">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" viewBox="0 0 20 17">
<path d="M10 0l-5.2 4.9h3.3v5.1h3.8v-5.1h3.3l-5.2-4.9zm9.3 11.5l-3.2-2.1h-2l3.4 2.6h-3.5c-.1 0-.2.1-.2.1l-.8 2.3h-6l-.8-2.2c-.1-.1-.1-.2-.2-.2h-3.6l3.4-2.6h-2l-3.2 2.1c-.4.3-.7 1-.6 1.5l.6 3.1c.1.5.7.9 1.2.9h16.3c.6 0 1.1-.4 1.3-.9l.6-3.1c.1-.5-.2-1.2-.7-1.5z"
/>
</svg>
<span>Choose a file…</span>
</label>
</div>
<input type="password" name="password" class="password-input" placeholder="Enter the password for upload" />
<button type="submit" name="submit" value="Start upload" class="button expanded submit-btn">Submit</button>
</form>
</fieldset>
</div>
<div class="large-6 cell">
<!-- file list -->
<fieldset>
<legend>Previousely uploaded files</legend>
<ul id="menu">
<!-- file list menu -->
<li>
<a href="">All files</a>
</li>
<li>
<a href="">Documents</a>
</li>
<li>
<a href="">Images</a>
</li>
<li>
<a href="">Applications</a>
</li>
</ul>
<table id="files">
<!-- file list uploads -->
<?php echo $uploaded_files; ?>
</table>
</fieldset>
</div>
</div>
</div>
答案 3 :(得分:0)
然而,我的原始代码实际上完全正常。
意外工作。例如,如果emailaddress1 ='NULL'
(由四个字符组成的字符串值:N U L L),则条件的计算结果为FALSE,并且不正确。由于电子邮件地址不太可能是NULL
,所以是 - 它完美地运作了:)
有关详细解释,请参阅此答案:NOT IN selection with NULL values
简而言之:
与NULL和三值逻辑(3VL)的比较
由于Null不是任何数据域的成员,因此不被视为a “值”,而是表示缺席的标记(或占位符) 有价值的。因此,与Null的比较永远不会导致 无论是真还是假,但始终是第三个逻辑结果, 未知的。[8]比较下面表达式的逻辑结果 10到Null的值是Unknown:
SELECT 10 = NULL - 未知结果
这两个比较: x = NULL且x&lt;&gt; NULL计算结果为NULL(未知)。
在您的情况下,例如and telephone1 != 'NULL'
,如果telephone
为NULL,则整个条件的计算结果为NULL,在WHERE子句中将其视为false
条件。