Act*_*veX 5 sql sql-server search between where
简单的问题:
我需要一个解决方案,以便我可以在AF之间找到,比如名字,包括所有以F开头的名字.
如果您使用BETWEEN或A> = value <= F,您会发现它在F处停止.所以我发布此建议.
注意:用户将看到2个接受范围用户可以键入的文本框.用户在F边界中精炼了多远:"Fa"中的用户类型意味着结果应返回:Fauder,Fail,Fmber,...等
我目前有2个解决方案,但有一个更好的方法.
解决方案1:这将向外边界添加1,但如果名称为单个'G',则可能包含结果,但极不可能.名称> ='A'和<= CHAR(ASCII('F')+ 1)
解决方案2:此解决方案附加字母字符长度时间的最后一个字母.名称> ='A'和<='FZZZZZZZZZZZZZZZZZZZZZ'
虽然上面的解决方案是可行的,但我的搜索可以这样改进:A到Fs(应该给我从A到Fs的所有东西......).使用此解决方案#1因为它与单个ascii一起工作而被破坏.
欢迎提出建议.
你可以做:
WHERE name >= 'A' AND name < 'G'
Run Code Online (Sandbox Code Playgroud)
在评论中,您扩展了要求以包括A- Fxxx。
SET @start = 'A'
SET @end = 'Fxxx'
SELECT
*
FROM
table
WHERE
(name >= @start AND name < @end)
OR (name LIKE @end + '%')
Run Code Online (Sandbox Code Playgroud)
请注意,这不包括现场功能name;此类函数可防止对索引进行范围搜索。然而,包含这些OR也会降低索引的搜索量。虽然它是额外的代码,但在某些情况下这实际上可以提高性能......
SELECT
*
FROM
table
WHERE
(name >= @start AND name < @end)
UNION ALL
SELECT
*
FROM
table
WHERE
(name LIKE @end + '%')
Run Code Online (Sandbox Code Playgroud)
编辑
事后看来,您的解决方案 2尽管您不喜欢它,但可能是最好的。
Fxxx只要您知道最大字符串长度,使用转向FxxxZZZZZZZZZZ就足够简单了STUFF(),您应该这样做,因为数据库是您的。
它在字段上没有任何函数,并且在子句中name不使用 an 。这意味着您可以对任何指数进行纯范围搜索。ORWHERE
就性能而言,我认为您无法对此进行改进。