【问题标题】:SQL Statement - How to write a WHERE clause with wildcardSQL 语句 - 如何使用通配符编写 WHERE 子句
【发布时间】:2022-01-25 06:27:59
【问题描述】:

我有一个 C# 应用程序,其中包含一个包含此 WHERE 子句的 SQL 查询:

WHERE 
    A.Location = @Location
    AND Widgets.Branch = @Branch

要求已更改,因此用户可以要求查看所有分支。我知道我可以编写一个 if 语句来查看我是否有一个已传入的分支参数......然后有一个不同的 select 语句完全省略了分支的 AND 子句。

但我想知道是否有更简单的方法可以做到这一点?我可以传入某种通配符吗?

我尝试了 '*' 或 '%' 但这似乎不是正确的语法。我知道 % 与 LIKE 一起使用...

任何建议/提示将不胜感激。

编辑 1

所以我想弄清楚如何使用

WHERE 
    A.Location = @Location
    AND (@Branch IS NULL OR Widgets.Branch = @Branch)

接近。

我的部分代码如下所示:

 using (var conn = new SqlConnection(connectionString))
 {
      activityByUserType = conn.Query<ActivityDetailsByUserTypes>(
      @"
                SELECT 
                    ReportRefreshDate,
                    other columns...
                FROM 
                    (SELECT
                         columns
                     FROM table1 A
                     INNER JOIN Widgets ON LOWER(fieldAA) = LOWER(A.fieldAA)
                     WHERE 
                         A.Location = @Location
                         AND Widgets.Branch = @Branch) DetailedResults
                 GROUP BY ReportRefreshDate;
                ",
                new { Branch=branchId, Location = LocationId, RefreshDate = dateRange}).ToList();
        }
        return activityByUserType;

如您所见,我正在创建一个新的查询对象......并在代码块的末尾传递一个参数列表给它。

我更改了逻辑以在 USING() 之前添加此 if 语句

if (branchId.Equals("allbranches")) 
{
   branchId = null;
}

但这似乎并没有真正起作用。

【问题讨论】:

  • 我知道我可以写一个 if 语句 .. 然后有一个不同的 [where] 语句完全省略分支的 AND 子句 - 是的,你应该跨度>
  • 寻找避免编写代码的技巧(即“更简单的方式”)可能会导致代码效率降低。我留给你 Erland 对 dynamic search conditions 的讨论,它在存储过程的上下文中讨论了这一点——但同样的考虑也适用于你的应用程序代码。
  • @CaiusJard 你能解释一下为什么这种方法更好吗?那会很有帮助。
  • SMor 发布了一个深入了解它的链接 - 这是我想到的,但找不到..
  • @SM如果你作为答案发帖,我会接受。

标签: c# sql sql-server wildcard


【解决方案1】:

您可以在WHERE 子句中检查参数是否为空:

    WHERE 
        A.Location = @Location
    AND
        (@Branch IS NULL OR Widgets.Branch = @Branch)

@Branch 参数为空时不会过滤分支。

【讨论】:

  • 或者,don't
  • @haldo,你能看看我帖子中的 EDIT 1 吗?试图弄清楚如何将您的方法应用于我的代码。
  • @dot 你可以试试(@Branch = 'allBranches' OR Widgets.Branch = @Branch) 吗?
  • @dot 看起来您正在使用 Dapper?当branchId 为空时,您可能需要帮助编译器推断类型:new { Branch=(string)branchId, ... 并与您添加的新代码一起使用
  • @haldo 最后,我想我将使用我最初在大脑上使用的长方法,以防万一有性能问题。但是,我也赞成你的回答,因为这是我想知道的那种方法,至少现在我知道它可以做到!
【解决方案2】:

您可以在查询本身中显式检查星号:

@Branch IN ('*', Widgets.Branch)

这样,如果您传递@Branch=*,则忽略该列,否则将与该列的值进行比较。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2013-07-07
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多