【问题标题】:How can you use NULLIF in the where clause?如何在 where 子句中使用 NULLIF?
【发布时间】:2019-03-19 14:45:13
【问题描述】:

我正在尝试做这样的事情:

select
     col_1, col_2, etc
from
     table
where
     col_1 = nullif('', '')

我做错了吗?我没有得到任何结果。

编辑:

我的预期结果是返回 col_1 为 NULL 的每条记录。

我知道我可以使用 col_1 为空的地方,但我使用的是 SSIS 和一个变量。有时 col_1 实际上是 NULL,有时不是。

样本数据:

 collaboration     first_name     last_name          city     
          NULL            Bob         Smith       Chicago
Data Migration           John         Smith        Austin
          NULL           Pika           Chu       Houston
    Production            ash       ketchum         tokyo

有时我可能想返回协作为 NULL 的记录,有时我想返回显示为 Production 的记录。

如果可能的话,我想使用相同的查询,只需稍作修改。

编辑第 2 部分:

我尝试过这个。

select
     col_1, col_2, etc
from
     table
where
     case
         when col_1  = '' then NULL
         else col_1
         end

但我收到错误消息:

An expression of non-boolean type specified in a context where a condition is expected, near ORDER.

查询速度不是我关心的。

【问题讨论】:

  • 您的数据和预期结果是什么?
  • 你想做什么?你看过documentation关于如何使用NULLIF()吗?
  • col_1 = nullif('', '')Col_1 = NULL 相同,永远不会返回true;因为没有任何东西等于NULL(包括NULL)。
  • 你说知道你可以使用where col_1 is null,但我不明白你为什么不能。请展示 SSIS 中存在变量阻止您这样做的实际情况。
  • 如果你能给我们一些样本数据和预期的结果,那就容易多了。

标签: sql sql-server nullif


【解决方案1】:

这是您需要的查询

select
     col_1, col_2, etc
from
     table
where
     col_1 is null

is null 检查列是否为空,nullif(@expr1,@expr2) 可以重写为:

case when @expr1 = @expr2 return null else return @expr1 end

编辑: 您可以放宽过滤器将OR 条件添加到“where”子句中(提示:记住ANDOR 之前评估)

select
     col_1, col_2, etc
from
     table
where
     (col_1 is null OR col1 like 'production')

如果你想决定你需要的运行时间,你可以编写一个过程:

create proc my_proc @var AS varchar(100) = 'NULL§159§' -- this defaults to null, if you put a parameter it queries with parameter passed
as
select
         col_1, col_2, etc
    from
         table
    where
         WHERE coalesce(col_1,'NULL§159§') = @var 
-- added §159§ symbol to the null to make sure the queried string is impossible in the database, 
-- obviously into the database the value 'NULL159' hase become a sort of 'reserved word', but hopefully is odd enough not to appear in data
GO

并通过exec my_proc('production')调用它

【讨论】:

  • 有时为空,有时不是。我需要能够处理这两种情况。
  • 您的问题表明 “我的预期结果是让 col_1 为 NULL 的每条记录都返回。” @LunchBox ;这正是这个答案的作用。
  • 输入样本数据和所需的输出,让我们了解您真正需要什么,因为根据您当前的要求,这就是答案
  • 使用 SP 来封装行为是一个不错的选择。但是,正如所写,默认参数将始终导致 SQL 不返回任何记录。 (我会使用IFWHERE col_1 IS NULL 进行第二个查询,其他人可能只有一个与WHERE col_1 = @var OR (col_1 IS NULL and @var IS NULL) 的查询)
  • 正确性、健壮性、可维护性和性能都会因您的选择而受到影响。如果说 25 年的编码教会了我什么,那就是为了简洁的 hack 仍然是 hack,它们总是会以一种或另一种方式回来咬你。但这是你的答案。
【解决方案2】:

试试这个,它可以处理空值或空格的列

SELECT
     col_1, col_2, etc
FROM
     Table
WHERE
     ISNULL(NULLIF(col_1 ,''),'1') = '1'

【讨论】:

  • 布尔逻辑是处理WHERE 中事物的更好方法。这可能会产生一些(严重的)性能问题,因为 NULLIFISNULL 会使查询不可搜索。
  • 有趣。如果我将 '1' 替换为 'THIS WAS A NULL VALUE',它不起作用,但它可以使用 '1'。
  • 1什么的不用说,我只是好奇。
【解决方案3】:

你可以做类似的事情

select
     col_1, col_2, etc
from
     table
where
     col_1 IS NULL OR col_1 = ''

【讨论】:

  • 我想要一个或另一个,但不是两个。
【解决方案4】:
select
     col_1, col_2, etc
from
     table
where
     collaboration IS NULL OR collaboration ='Production'

【讨论】:

  • 请添加一些信息来解释这是如何解决问题的。谢谢!
【解决方案5】:

我的水晶球时间。这是我对 OP 想要什么的猜测:

DECLARE @Prod varchar(15);
--SET @Prod = 'Production';

SELECT {Columns}
FROM YourTable
WHERE Col1 = @Prod
   OR (Col1 IS NULL AND @Prod IS NULL);

【讨论】:

    【解决方案6】:

    试试这个。

    DECLARE @SearchValue VARCHAR(50)
    SELECT col_1, col_2, etc
    FROM YourTable
    WHERE ISNULL(col_1,'') = ISNULL(@SearchValue,'')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-11-30
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多