【问题标题】:get all rows from db if parameter added to where clause is null如果添加到 where 子句的参数为空,则从 db 获取所有行
【发布时间】:2018-10-11 09:06:32
【问题描述】:

我有很大的选择条件。

WHERE ADB.param1=@param

在我发送参数变量的位置

        SqlParameter param1Param = cmd.Parameters.AddWithValue("@param1", param1);
        if (param1== null)
        {
            param1Param.Value = DBNull.Value;
        }

此代码的工作方式如下。 当查询执行时,它总是检查ADB.param1=param 条件,当我发送 DBNull.Value 时,它​​从数据库中什么也得不到。 但我想要的不是那个

如果参数== null

然后它不注意这种情况并从数据库中获取所有行。我怎样才能做到这一点?

【问题讨论】:

  • 假设我们讨论的是 MS SQL Server,您不能使用 = 将列值与 NULL 进行比较...您必须使用 IS NULLIS NOT NULL
  • 为什么不动态构建查询?当param1 为空时,只需从查询中丢弃WHERE ADB.param1=param
  • 这部分代码你能写吗?我的意思是检查 ADB.param1=@param 如果@param 不为空
  • where (ADB.param1=@param or @param is null)
  • @David - 当@param 为空时,您希望查询返回所有行...还是只返回param1 为空的行?

标签: c# sql if-statement null where


【解决方案1】:

这是一个甚至不需要更改 C# 代码的技巧:

WHERE ADB.param1 = COALESCE(@param, ADB.param1)

对于非 SQL NULL 值,@param 必须等于 ADB.param1 列。否则,WHERE 子句将始终为真,并返回所有记录。

【讨论】:

  • 不会返回 ADB.param1 为空的行。 (如果存在这样的行。)
【解决方案2】:

如果要返回@param1 参数为空的所有行,请使用...

where (@param1 is null or ADB.param1 = @param1)

如果您只想返回 param 的列值为 null 的行,请使用...

where ((@param1 is null and ADB.param1 is null) or ADB.param1 = @param1)

【讨论】:

  • 在这种情况下,我得到所有 ADB.param1 等于“0”的行,但我希望它是存储在 DB 行中的内容
  • 抱歉@David,我不确定我是否理解您的评论。您是说我的回答不能满足您的需要,还是您要澄清它确实如此?
  • where ((@param1 is null and ADB.param1 is null) or ADB.param1 = @param1) 给出所有行,但 ADB.param1 在每行中显示为“0”。而不是我想在@param1 为空时获取所有具有相应 ADB.param1 的行
  • @David,好的,试试这个:where ((@param1 is null and ADB.param1 is null) or (@param1 is not null and ADB.param1 = @param1))
  • 感谢您的帮助,但我选择了 Tim Biegeleisen 解决方案。它工作得很好。还是谢谢!
【解决方案3】:

我假设您的查询是WHERE ADB.param1=@param1

试试WHERE (ADB.param1=@param1 OR @param1 IS NULL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 2021-11-05
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多