SQL - 对!=' NULL'的解释

时间:2018-04-30 19:00:26

标签: sql sql-server null

我的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'

的字符串值

如果有人知道,我将非常感谢您的解释!感谢。

4 个答案:

答案 0 :(得分:0)

我在猜测

SET ANSI_NULLS OFF

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-2017

或者其他人建议将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&hellip;</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条件。