【问题标题】:How to ignore left padding in a LIKE statement?如何忽略 LIKE 语句中的左填充?
【发布时间】:2014-12-01 13:08:51
【问题描述】:

我正在修改 ID 搜索栏的代码,并试图让用户能够使用 SQL 语法搜索 ID,例如“%535%”。这样做很简单,但我一直在寻找和绞尽脑汁一段时间,我似乎无法找到解决以下问题的方法:

问题是ID都是左填充的varchar(14),如:

'          8534'
'        393583'
'    123456/789'

这实际上使用户无法搜索以特定序列开头的 ID,因为 '85%' 由于空白填充而不会返回任何结果。

我正在维护的网站是一个用经典 ASP(w/JScript)编写的老网站,搜索是通过一个存储过程完成的,整个 'WHERE' 子句作为参数传入。

我无法修改数据库,所以我要问的是:有什么方法可以修改子句,以便忽略填充并且 '52%' 返回以 52 开头的 ID?

【问题讨论】:

  • 在下面回答,但如果你展示它,我可以将它应用到你的查询中。
  • 我认为您希望 52% 返回以 52 开头的条目,而不是 %52
  • 查询隐藏在存储过程中,并根据布局表返回列,所以我传入的只是WHERE子句,它是使用列标题中的数据动态构建的,包含文本框。
  • @Akash 我的错!已编辑的问题。

标签: sql sql-server sql-server-2008 sql-like


【解决方案1】:

你想要:

where ltrim(id) like '123%'

或者,假设id中没有内部空间:

where concat(' ', id) like '% 123%'

【讨论】:

    【解决方案2】:
    SELECT LTRIM(ID) FROM table WHERE ID LIKE '%1234%'
    

    编辑因为你只能修改 WHERE 语句

    WHERE LTRIM(ID) LIKE '1234%'
    

    【讨论】:

    • 感谢@Matt 的快速回答!不幸的是,我不能修改 select 语句本身,只能修改 WHERE 子句。由于 ID 是按照问题中的描述存储的,因此使用“%1234%”搜索会得到所有包含“1234”的项目,而不仅仅是那些以它开头的项目。基本上我需要的是用户输入'1234%'并返回' 1234'' 12345'而不是' 01234'
    • 这会起作用,但要意识到您的查询不会在此搜索中使用任何索引。对于每个查询,它必须查看表中的每一行。如果表很大,它会很慢。最好的方法是将持久计算列添加到在该字段上具有 LTRIM 的表中。下一个最好的方法是索引视图,但这两个都需要更改数据库。
    【解决方案3】:

    where 子句中的函数往往很慢。这样的事情可能会更快:

    where id like '123%'
    or id like '% 123%'
    

    【讨论】:

    • 谢谢!这正是我正在寻找的。​​span>
    猜你喜欢
    • 2013-07-06
    • 2014-08-20
    • 2014-08-17
    • 2020-05-15
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多