【问题标题】:How to use null value IN operator SQL如何使用空值 IN 运算符 SQL
【发布时间】:2019-12-13 13:12:48
【问题描述】:

我的 [Transfer-from Code] 列有问题。
大约有 30 种不同的值。
但我需要 [Transfer-from Code] 的所有值,即 x1、x2 和 NULL。

代码如下:

SELECT 
       ILE.[Item No_]           AS ItemNo
      ,It.[Tariff No_]          AS TariffNo
      ,ILE.[Posting Date]       AS PostingDate
      ,ILE.[Location Code]      AS LocationCode
      ,ILE.[Quantity]           AS Qty
      ,CASE 
       WHEN ILE.[Entry Type] = 0 THEN 'Purchase'    
       WHEN ILE.[Entry Type] = 4 THEN 'Transfer'
       ELSE '' END AS EntryType
      ,Trp.[Transfer-from Code] AS SourceLocation
      -- Try to cast from below all NULL values to be test, so I can use them into IN operator. Still not working
      --,ISNULL(Trp.[Transfer-from Code], 'test') AS SourceLocation

FROM [MDR].[dbo].[nav_XX$Item_Ledger_Entry]             AS ILE 
LEFT JOIN [MDR].[dbo].[nav_XX$Item]                     AS It ON ILE.[Item No_] = It.No_
LEFT JOIN [MDR].[dbo].[nav_XX$Transfer_Receipt_Header]  AS Trp on ILE.[Document No_] = Trp.No_

WHERE ILE.[Entry Type] IN ('0','4')
AND ILE.[Posting Date] > '2019-12-11 00:00:00.000'
AND ILE.[Location Code] IN ('X24','XB16')

--From this part below, everything don't work. I'm getting only the values for X1 and X2.

--AND TRP.[Transfer-from Code] IN ('X1','X2',NULL)

--AND TRP.[Transfer-from Code] IN ('X1','X2','test')

/*
AND TRP.[Transfer-from Code] = 'X1'
OR TRP.[Transfer-from Code] = 'X2'
--OR TRP.[Transfer-from Code]= NULL
OR TRP.[Transfer-from Code]= 'test'
*/

谁能告诉我我的错误在哪里?

【问题讨论】:

  • field IN (...) OR field IS NULL
  • @DmitryBychenko AND TRP.[Transfer-from Code] IN ('X1','X2', IS NULL) 它不起作用。我收到错误:关键字“IS”附近的语法不正确。
  • where TRP.[Transfer-from Code] IN ('X1','X2') is not false 将返回 x1、x2 和 null。
  • 顺便说一句,您使用的是哪个 dbms? (也许是 MS SQL Server?)
  • @jarlh MS SQL Server

标签: sql sql-server casting null isnull


【解决方案1】:

你的情况应该是:

AND (TRP.[Transfer-from Code] IN ('X1','X2') OR TRP.[Transfer-from Code] IS NULL)

仅使用运算符ISIS NOT 来检查NULLs。
永远不要使用=IN,因为与NULL 比较的结果始终是NULL

【讨论】:

    【解决方案2】:

    "="替换为"IS",添加"()"就可以了。

    试试:

    AND 
    (
        TRP.[Transfer-from Code] = 'X1'
        OR TRP.[Transfer-from Code] = 'X2'
        OR TRP.[Transfer-from Code] IS NULL
    )
    

    【讨论】:

      【解决方案3】:

      Null有一个特殊含义它代表未知没关系等等。这就是它有特殊含义的原因要检查的语法

       field IS NULL
      

      你的情况

       (field IN (item1, item2, item3) OR field IS NULL)
      

      例如

       (TRP.[Transfer-from Code] IN ('X1', 'X2') OR TRP.[Transfer-from Code] IS NULL)
      

      请注意,即使文字喜欢

       field = NULL
      

       field IN (null)
      

      语法正确,当fieldNULL 时,结果既不是true 也不是false,而是NULL(是的,NULL = NULL不是 true):

      如果field 具有未知值 (Null) 等于某个其他未知值 (Null)? 未知 (Null)

      【讨论】:

      • 请注意,field = NULLfield IN (null) 不是有效的 ANSI SQL 语法。 (但被许多 dbms 产品所接受。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 2016-12-06
      • 1970-01-01
      • 2012-09-27
      • 2012-07-06
      相关资源
      最近更新 更多