我想知道是否可以在不考虑某些单词的情况下使用ORDER BY子句(或任何其他子句)进行排序。
例如,文章"the":
- 瑞士银行
- 美国银行
- 英格兰银行
应分类为:
- 美国银行
- 英格兰银行
- 瑞士银行
而非
- 美国银行
- 瑞士银行
- 英格兰银行
select * from #test
order by
case when test like 'The %' then substring(test, 5, 8000) else test end
如果您想要删除的单词数量有限,那么您可以通过明智地使用REPLACE
来删除它们,例如
ORDER BY REPLACE(REPLACE(' ' + Column + ' ',' the ',' '),' and ',' ')
然而,随着单词数量的增加,您将有越来越多的嵌套REPLACE
调用。此外,此ORDER BY
将无法从任何索引中获益,并且无法处理标点符号。
如果这种排序很频繁,并且查询能够从索引中受益,则可以考虑将上面的列作为计算列,并在其上创建索引(然后按计算列排序)。
您需要编码一种方法,将一个字符串转换为另一个字符串,然后按此排序。
例如,如果该方法只是去除"the"的开始出现。。。
ORDER BY
CASE WHEN LEFT(yourField, 4) = 'The ' THEN RIGHT(yourField, LEN(yourField)-4) ELSE yourField END
或者,如果你想忽略"the"的所有出现,只要使用REPLACE。。。
ORDER BY
REPLACE(yourField, 'The', '')
你可能会得到一个相当复杂的换位,在这种情况下,你可以做这样的事情。。。
SELECT
*
FROM
(
SELECT
<complex transposition> AS new_name,
*
FROM
whatever
)
AS data
ORDER BY
new_name
不是,不是因为the
在这种情况下是任意的。你能做的最接近的就是修改字段值,比如下面的:
SELECT field1
FROM table
ORDER BY REPLACE(field1, 'The ', '')
问题是,要替换两个单词,你必须使用下一个REPLACE
语句,如果你有超过五个单词,这将成为一个巨大的问题:
SELECT field1
FROM table
ORDER BY REPLACE(REPLACE(field1, 'of ', ''), 'The ', '')
更新:您实际上不需要检查the
或of
是否出现在字段的开头,因为您只想按重要单词排序。例如,Bank of America
应出现在Bank England
之前(of
不应使其在之后选择)。
我的解决方案缩短了一点
DECLARE @Temp TABLE ( Name varchar(100) );
INSERT INTO @Temp (Name)
SELECT 'Bank of Switzerland'
UNION ALL
SELECT 'Bank of America'
UNION ALL
SELECT 'The Bank of England'
SELECT * FROM @Temp
ORDER BY LTRIM(REPLACE(Name, 'The ', ''))