【问题标题】:SQL Server, using or statement conditionSQL Server,使用或语句条件
【发布时间】:2019-11-13 22:18:21
【问题描述】:

我正在使用一个查询,它在一个表中搜索两个条件。我举个例子:

Select * 
from Customers 
where mobile= '" + textboxt1.Text + "' or Phone = '" + textboxt1.Text + "' 

查询返回给我的第一行手机号码或电话号码与我的textbox1.Text 相同。

我需要设置一个条件:开始查找“整个表”以查找第一个“或”语句(移动设备)。如果不存在任何结果,则使用第二个或条件(电话)再次搜索整个表。

有什么简单的方法可以让我编写查询吗?或者我需要为此使用一个案例吗?

【问题讨论】:

  • 请参数化你的SQL!停止注入值!此外,您确实需要命名您的对象。当您在一周多的时间内审核您的申请时,textboxt1textboxt2 对任何人(包括您)都将毫无意义。 Little Bobby Tables
  • 另一方面,SQL Server 2008 现在完全不受支持。您真的应该尽快考虑升级路径。
  • 我建议像SELECT TOP 1 * FROM (Select 'a' as Bob, * from Customers where mobile= @Value UNION ALL Select 'b' as Bob, * from Customers where phone = @Value) ORDER BY Bob 这样的东西。这将比手机匹配更早地为您提供移动匹配。
  • @Shmeeku:这个问题是用 C# 标记的,所以这段代码在该语言中比在 T-SQL 中更有意义。
  • “不支持”并没有传达出事物的全部重要性。 Sql Server 2008 现在生命周期结束。这意味着根本不会发布新的更新...甚至没有关键的安全补丁。了解这一点有助于更清楚为什么继续使用这个旧版本是危险和不负责任的

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

假设表中不超过一条记录与mobile 匹配,并且不超过一条记录与phone 匹配(考虑到您对用例的描述,这似乎相关),您可以使用top 1 和条件排序:

select top 1 * 
from Customers 
where mobile= @textboxt1 or phone = @textboxt2
order by case when mobile= @textboxt1 then 0 else 1 end

如果一条记录在mobile 上匹配,条件排序子句将把它放在首位,top 1 将消除phone 上的(可能的)其他记录匹配。否则,phone 上的(唯一)匹配记录将被保留。

注意:不要相信用户输入。始终使用prepared statement and query parameters。我修改了查询,使其使用参数(@textboxt1@textboxt2)。

【讨论】:

    【解决方案2】:

    您有时可以通过选择UNION 而不是OR 来提高性能。

    SELECT TOP 1 * FROM (
        SELECT *, 0 Ordinal
        FROM Customers
        WHERE mobile = @number
    
        UNION ALL
    
        SELECT *, 1 Ordinal
        FROM Customers
        WHERE phone = @number  
    ) t
    ORDER BY Ordinal
    

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2014-12-18
      • 2020-03-22
      • 2012-02-07
      • 2018-08-16
      • 2015-11-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多