SQL - 在AF之间查找名称的条件

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一起工作而被破坏.

欢迎提出建议.

Lam*_*mak 9

你可以做:

WHERE name >= 'A' AND name < 'G'
Run Code Online (Sandbox Code Playgroud)

  • @ActiveX - 对于"公式"是什么意思?,查询的预期参数是什么?,不,它不会返回"G"的名称. (2认同)

Mat*_*lie 1

在评论中,您扩展了要求以包括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

就性能而言,我认为您无法对此进行改进。