2012-03-27 65 views
5
之间找到名字

简单问题:SQL - 如果标准AF

我需要一个解决方案,使我能找到,可以说名,AF之间,包括与F.

如果你开始的所有名称使用BETWEEN或A> =值< = F你会发现它停在F.所以我发布这个建议。

注意: 用户将看到2个文本框接受范围用户可以键入。用户在F界限内改进了多远:'Fa'中的用户类型表示结果应该返回:Fauder,Fail,Famber等...

我目前有2个解决方案,但有一个一个更好的方法。

解决方案1: 这会将1添加到外部边界,但如果名称为单个'G',则可能会包含结果,但不太可能。 WHERE名> = 'A' AND < = CHAR(ASCII( 'F')+ 1)

解决方案2: 此溶液追加的字母字段长度倍最后一个字母。 其中name> =“A”和< =“FZZZZZZZZZZZZZZZZZZZZZ”

尽管上述解决方案是可行的,我的搜索可以被细化为这样: A到FS(应该给我一切从A到和包括Fs的.. ..)。有了这个解决方案,#1破解了,因为它使用单个ASCII。

建议欢迎。

+0

用于什么服务器? – 2012-03-27 16:06:04

+0

SQL Server 2000或更高版本 – ActiveX 2012-03-27 16:12:03

回答

1

在评论你扩大需求,包括A - Fxxx

SET @start = 'A' 
SET @end = 'Fxxx' 

SELECT 
    * 
FROM 
    table 
WHERE 
    (name >= @start AND name < @end) 
    OR (name LIKE @end + '%') 

请注意,这不包括在name字段上的功能;这些功能会阻止范围寻找索引。但是,包含OR也会降低索引查找的效率。虽然这是额外的代码,这实际上可能是更好的性能,是某些情况下...

SELECT 
    * 
FROM 
    table 
WHERE 
    (name >= @start AND name < @end) 

UNION ALL 

SELECT 
    * 
FROM 
    table 
WHERE 
    (name LIKE @end + '%') 


编辑

现在回想起来,你解决方案2,虽然你不喜欢它,可能是最好的。

Fxxx转换为FxxxZZZZZZZZZZ对于STUFF()来说很简单,只要知道最大字符串长度,您应该按照数据库的设置进行操作。

它在name字段没有任何功能,并且在WHERE子句中不使用OR。这意味着您可以在任何索引上获得纯搜索范围。

表现明智,我不认为你可以改善这一点。

+0

这就是我正在寻找的!非常感谢,谢谢大家的回复。 – ActiveX 2012-03-27 16:47:37

9

你可以这样做:

WHERE name >= 'A' AND name < 'G' 
+0

只有我们可以硬编码的东西。我正在寻找一个公式。上面还会返回一个名字,即'G',这是不正确的。 – ActiveX 2012-03-27 16:12:33

+2

@ActiveX - 你对“公式”的含义是什么?你的查询的期望参数是什么?不,它不会返回一个名字是'G'。 – Lamak 2012-03-27 16:14:26

+0

@ActiveX - 它使用'<而不是'<='或'BETWEEN'。这是一种非常正常且强大的模式,它并不关心'name'字段中有多少个字符,或者需要'name'字段中的任何函数(这很重要,因为这样的函数会破坏使用索引范围的能力寻求)。就个人而言,这正是我所使用的。 – MatBailie 2012-03-27 16:18:06

4

这个怎么样?

WHERE SUBSTR(name, 1, 1) >= 'A' AND SUBSTR(name, 1, 1) <= 'F' 
+0

不错。这将工作,但需要更多的编程。在我的情况下,用户可以将搜索细化到:A - Fs或A Fxxx。我可以使用你的方法,并编写一些代码来计算第二个边界的字段长度并将其提供给substr,但它变得混乱。 – ActiveX 2012-03-27 16:18:43

+2

工作,但在'name'字段周围放置一个函数可以防止索引查找,并导致全面扫描。 – MatBailie 2012-03-27 16:19:13

+1

@ActiveX - 你是什么意思使用可以指定'A' - 'Fxxx'?这会显着改变您在问题中描述的行为。请你能更新问题以包括你需要的所有功能吗? – MatBailie 2012-03-27 16:22:40

2

这会不会对你的工作:

select * 
from MyTable 
where left(name, 1) between 'a' and 'f' 
+1

工作,但在'name'字段周围放置一个函数可防止索引查找,并导致全面扫描。 – MatBailie 2012-03-27 16:19:22

2

你能做出多少简单?

WHERE NAME LIKE '[a-f]%' 
+0

只能使用单个字符值。不在范围内,例如:A-Fa,A-Fb。我没有明确表示我的问题,我很抱歉。我编辑了我的问题并添加了更多细节。 – ActiveX 2012-03-27 16:56:33