【问题标题】:Optimize query to work for Lower Case and Upper Case [duplicate]优化查询以适用于小写和大写 [重复]
【发布时间】:2020-01-27 18:05:43
【问题描述】:

我想优化我的查询以返回用户插入 New YorkNEW YORKnew york 的结果 我在db 中有大约 10000 条记录,有些记录以较高的后面一些较低的后者开头,如果我像 New York 这样插入,我的查询不会返回结果。

 [WebMethod]
        public string GetAkontasByMjesto(string Mjesto)
        {
            OracleConnection conn = new OracleConnection("DATA SOURCE=test-1:1521/fba;USER ID=test;PASSWORD=test");
            OracleDataAdapter dr = new OracleDataAdapter("Select * from AKONTAS where MJESTO='" + Mjesto + "'", conn);
            DataSet ds = new DataSet();
            ds.Tables.Add("AKONTAS");
            dr.Fill(ds, "AKONTAS");
            DataTable tt = ds.Tables[0];
            return ds.GetXml();
        }

这个问题有什么解决办法吗?

【问题讨论】:

  • 真正的问题是允许SQL注入攻击和转换错误的字符串连接。如果Mjesto 包含';drop table AKONTAS;// 会发生什么?
  • 这不是这个问题的重复吗? stackoverflow.com/questions/5391069/… |你基本上只是想让它不区分大小写,对吧?
  • 这个问题对你有帮助吗? stackoverflow.com/questions/5391069/…
  • @Xerrox 可能不是您,但是由于您的代码正在扫描整个表而必须等待的外部人员代码呢?不要介意看到 IO 峰值的 DBA。无论如何,Dmitry Bychenko 在评论中解释说,您可以在 Oracle 中的函数上创建索引。在这种情况下,您可以使用UPPER(MJESTO) 而不会降低性能。添加索引是一个小改动,可能更容易被接受。
  • 副本为这个问题提供了两个很好的解决方案

标签: c# asp.net oracle soap


【解决方案1】:

您可以同时降低 Mjesto(参数名称)和 MJESTO(列名称)

[WebMethod]
public string GetAkontasByMjesto(string Mjesto)
{
    OracleConnection conn = new OracleConnection("DATA SOURCE=test-1:1521/fba;USER ID=test;PASSWORD=test");
    OracleDataAdapter dr = new OracleDataAdapter("Select * from AKONTAS where lower(MJESTO) ='" + Mjesto.ToLower() + "'", conn);
    DataSet ds = new DataSet();
    ds.Tables.Add("AKONTAS");
    dr.Fill(ds, "AKONTAS");
    DataTable tt = ds.Tables[0];
    return ds.GetXml();
}

【讨论】:

  • 这将阻止服务器使用任何索引。查询将不得不扫描整个表。这不是生产系统的可行解决方案
  • 反例Mjesto = "cap d'antibes";不要硬编码撇号
  • @Fildor 土耳其人i!哎哟!
  • @PanagiotisKanavos 是的,是的。一旦你遇到它,你会永远记住。
  • @Fildor 这是一个well known problem,它解释了为什么只使用 UPPER 或 LOWER 不够
【解决方案2】:

您需要使用 UPPER

例如:

select * 
from yourtable 
where upper(column) = upper('nEw York');

【讨论】:

  • 这将阻止服务器使用任何索引。查询将不得不扫描整个表。这不是生产系统的可行解决方案
  • @Panagiotis Kanavos:在 Oracle 的情况下,我们可以在 function 上建立索引,在这种情况下为 Upper(column)
  • @DmitryBychenko 或其他数据库中的索引计算列。如果 OP 可以修改数据库,这是一个可行的想法,并且可能比更改排序规则更容易通过 DBA
猜你喜欢
  • 2010-12-24
  • 2021-11-24
  • 2011-06-15
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多