2012-04-02 48 views
0

在我的表中有代码,这些代码基本上是十进制值。例如,该代码列包含像001.0数据,00.10002.000.20等我必须写其示出了下面的结果而从UI搜索代码值中的SQL查询:搜索条件的SQL查询

  • 如果用户搜索0010,我要显示所有的值001.000.10

  • 如果用户搜索001.0,我必须表明像001.0值,001.1

  • 如果用户搜索00.10,我必须表明价值00.1000.12

请帮我写SQL查询上述标准。

+0

执行代码总是只包含4个数字和一个(随机放置)小数点?这个观点总是存在吗? – 2012-04-02 10:48:23

+0

如果用户输入“001.1”,结果如何? – 2012-04-02 10:49:02

+3

规则是“如果没有'.'被指定,所有的数字都必须完全匹配,并且'.'被忽略,并且'如果'.'被指定,那么一个完全匹配必须发生直到最后一个非零数字” ?请尽量仔细描述匹配规则 - 以上两个是根据您的有限示例进行的最佳猜测。你可以用更多的想法来描述它们,我们就更有可能为整体问题提出答案。 – 2012-04-02 10:49:07

回答

1

并非所有的事情都完全清楚你的规则,但我希望以下内容至少能成为你的起点。

显然,搜索词应该以两种方式处理,具体取决于它是否包含小数点。所以首先你需要知道点是否存在。这可以通过使用CHARINDEX()函数来完成:如果它返回0,则小数点在搜索项中不存在,否则它就在那里。因此,你的完成条件的结构将是这样的:

WHERE CHARINDEX('.', @SearchTerm) = 0 AND … /* condition to match '0010'-like input */ 
    OR CHARINDEX('.', @SearchTerm) > 0 AND … /* condition to match input containing '.' */ 

条件来搜索长期没有.可能是这样的:

REPLACE(Code, '.', '') = @SearchTerm /* or maybe LIKE @SearchTerm + '%'? */ 

为当搜索词并包含如果条件.在我看来,比前一个麻烦,但无论如何,这里是我想出了:

Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%' 

它是如何工作,一步一个脚印,使用'001.0''00.10'为例:

Initial value             '001.0' '00.10' 
REPLACE(@SearchTerm, '0', ' ')         ' 1. ' ' .1 ' 
RTRIM(REPLACE(@SearchTerm, '0', ' '))       ' 1.' ' .1' 
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0')  '001.' '00.1' 
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%' '001.%' '00.1%' 

所以,你可以看到,该表达式的值应该满足您的规则包含.搜索字词的面具。

拉所有的条件一起,我们得到以下WHERE条款:

WHERE CHARINDEX('.', @SearchTerm) = 0 AND REPLACE(Code, '.', '') = @SearchTerm 
    OR CHARINDEX('.', @SearchTerm) > 0 AND 
     Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%' 
+1

如果无点搜索是常见的,那么可以通过具有可被索引的额外的'UndottedCode'列来改善性能。触发器可以根据对“代码”列的更改来维护该值。非规范化的性能!(sm) – HABO 2012-04-02 12:55:41

+0

@ user92546:好点。计算列可能是更好的选择。 – 2012-04-02 12:58:24