【问题标题】:Selecting from where column equals a value or is null with cases (Mssql)从列等于值或为空的情况下选择 (Mssql)
【发布时间】:2020-02-12 17:10:19
【问题描述】:

在下面的查询中,我对名为welds 的表进行搜索,该表有一个名为Welds.Prefix 的列,其中包含NULL 行、具有实际值的行和具有空值的行。我需要帮助修改下面的查询,以便当用户在 @Prefix 中输入非 null 和非空值时,它会找到匹配的行。当@Prefix 为空白时,它会找到 Welds.Prefix 为空白的位置或 Welds.Prefix 为空的位置,但我不知道该怎么做,我知道我可以进行更新查询并将具有空值的列更改为空白空间,但我正在寻找另一种方式。我运行下面的查询,我得到一个错误“关键字'OR'附近的语法不正确”我明白为什么我得到这个错误但我不知道如何解决它,谢谢。

注意:@Prefix 将在前端输入,不会只绑定'',我只是为了提问而把它放在查询中。

@Prefix varchar(30) = ''

select * 
from welds
WHERE Welds.Prefix = CASE WHEN @Prefix <> '' THEN @Prefix END
          OR Welds.Prefix = CASE WHEN @Prefix = '' THEN '' OR IS NULL END

编辑: 我基本上想选择 Weld.Prefix 为空的行以及 @Prefix = ' ' 时 Weld.Prefix = ' '

【问题讨论】:

  • 关注:CASE WHEN COND1 THEN EXPR1 WHEN COND2 THEN [.. n] [ELSE COND] END。在上面的代码中,表达式(不是条件)是'' OR IS NULL - 检查关键字的位置,这种不正确的语法会导致语法错误
  • 这能回答你的问题吗? How do I create a conditional WHERE clause?
  • 现在,..WHEN @PREFIX = '' OR @PREFIX IS NULL THEN.. 之类的内容可能是合适的.. 并没有真正阅读“语法错误”之后的整个问题,这作为印刷错误获得了密切的投票:)
  • @user2864740 这不起作用,因为“@prefix”不是空值,它只是空白

标签: sql sql-server case case-when


【解决方案1】:

我认为这是你想要的逻辑:

SELECT * 
FROM welds
WHERE Welds.Prefix = @sPrefix OR
      (@sPrefix = '' AND NULLIF(Welds.Prefix, '') IS NULL)

【讨论】:

  • 此查询仅显示 Blank Weld.Prefix 行,但不显示空行,这与我最初在最后一行中取出“or is null”时的查询结果相同跨度>
  • @916ixer 。 . .现在就试试。没有样本数据和期望的结果,有点不清楚您所说的“空白”是什么意思。
【解决方案2】:

你可以试试这个

DECLARE @Prefix VARCHAR(30) = ''

SELECT *
FROM welds
WHERE (ISNULL(@Prefix, '') = '')
    OR (
        ISNULL(@Prefix, '') <> ''
        AND ISNULL(Welds.Prefix, '') = @Prefix
        )

【讨论】:

  • 当我搜索空白的 Weld.Prefix 行时,此查询仍然显示实际具有值的 Welds.Prefix 行,我也想查看空行
  • 在这种情况下,只需将 where 条件添加为 - where Prefix = @Prefix
  • 我该怎么做?不知道如何在 where 条件之前放置 where 条件
【解决方案3】:

我刚刚遇到了一个几乎相同的问题并使用以下方法解决了:

DECLARE @Prefix VARCHAR(30) = '';

SELECT *
FROM Welds
WHERE (Welds.Prefix IS NULL AND @Prefix = '') 
    OR (Welds.Prefix = ISNULL(NULLIF(@Prefix, ''), Welds.Prefix));

【讨论】:

  • 欢迎来到 Stack Overflow!你的回答很好,但由于大约半年前已经有一个公认的答案,这个问题可能是多余的。
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2015-12-22
相关资源
最近更新 更多