从列等于值或为空的情况下选择(Mssql)

Selecting from where column equals a value or is null with cases (Mssql)

在下面的查询中,我正在搜索名为 welds 的 table,此 table 有一个名为 Welds.Prefix 的列,其中包含 NULL 行、具有实际值的行和行具有空值。我需要帮助修改下面的查询,以便当用户在 @Prefix 中输入非 null 和非空值时,它将找到匹配的行。当@Prefix 为空时,它会发现 Welds.Prefix 为空或 Welds.Prefix 为空但我不确定如何去做,我知道我可以进行更新查询并更改列空值到空格,但我正在寻找另一种方式。我 运行 下面的查询出现错误 "Incorrect syntax near the keyword 'OR'" 我明白为什么我会收到错误但我不确定如何修复它,谢谢。

注意:@Prefix会在前端输入,不会只绑定'',我只是为了提问才放在query里面的。

@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 为 null 和 Weld.Prefix = ' ' 当 @Prefix = ' '

的行

我想这就是你想要的逻辑:

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

你可以试试这个

DECLARE @Prefix VARCHAR(30) = ''

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

我刚刚遇到了一个几乎相同的问题并使用类似这样的方法解决了:

DECLARE @Prefix VARCHAR(30) = '';

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