搜索条件的SQL查询

时间:2012-04-02 09:54:45

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

在我的表中,有些代码基本上是十进制值。例如,代码列包含001.000.10002.000.20等数据。我必须编写一个SQL查询,在查询代码值时显示以下结果UI:

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

  • 如果用户搜索001.0,我必须显示001.0001.1等值。

  • 如果用户搜索00.10,我必须显示值00.1000.12等。

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

1 个答案:

答案 0 :(得分: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') + '%'