在我的表中有代码,这些代码基本上是十进制值。例如,该代码列包含像001.0
数据,00.10
,002.0
,00.20
等我必须写其示出了下面的结果而从UI搜索代码值中的SQL查询:搜索条件的SQL查询
如果用户搜索
0010
,我要显示所有的值001.0
,00.10
如果用户搜索
001.0
,我必须表明像001.0
值,001.1
等如果用户搜索
00.10
,我必须表明价值00.10
,00.12
等
请帮我写SQL查询上述标准。
在我的表中有代码,这些代码基本上是十进制值。例如,该代码列包含像001.0
数据,00.10
,002.0
,00.20
等我必须写其示出了下面的结果而从UI搜索代码值中的SQL查询:搜索条件的SQL查询
如果用户搜索0010
,我要显示所有的值001.0
,00.10
如果用户搜索001.0
,我必须表明像001.0
值,001.1
等
如果用户搜索00.10
,我必须表明价值00.10
,00.12
等
请帮我写SQL查询上述标准。
并非所有的事情都完全清楚你的规则,但我希望以下内容至少能成为你的起点。
显然,搜索词应该以两种方式处理,具体取决于它是否包含小数点。所以首先你需要知道点是否存在。这可以通过使用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') + '%'
如果无点搜索是常见的,那么可以通过具有可被索引的额外的'UndottedCode'列来改善性能。触发器可以根据对“代码”列的更改来维护该值。非规范化的性能!(sm) – HABO 2012-04-02 12:55:41
@ user92546:好点。计算列可能是更好的选择。 – 2012-04-02 12:58:24
执行代码总是只包含4个数字和一个(随机放置)小数点?这个观点总是存在吗? – 2012-04-02 10:48:23
如果用户输入“001.1”,结果如何? – 2012-04-02 10:49:02
规则是“如果没有'.'被指定,所有的数字都必须完全匹配,并且'.'被忽略,并且'如果'.'被指定,那么一个完全匹配必须发生直到最后一个非零数字” ?请尽量仔细描述匹配规则 - 以上两个是根据您的有限示例进行的最佳猜测。你可以用更多的想法来描述它们,我们就更有可能为整体问题提出答案。 – 2012-04-02 10:49:07