在我的表中,有些代码基本上是十进制值。例如,代码列包含001.0
,00.10
,002.0
,00.20
等数据。我必须编写一个SQL查询,在查询代码值时显示以下结果UI:
如果用户搜索0010
,我必须显示所有值001.0
,00.10
如果用户搜索001.0
,我必须显示001.0
,001.1
等值。
如果用户搜索00.10
,我必须显示值00.10
,00.12
等。
请帮我编写上述标准的SQL查询。
答案 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') + '%'