T-SQL/SQL SERVER中的排序(或ORDER BY子句的使用),而不考虑某些单词



我想知道是否可以在不考虑某些单词的情况下使用ORDER BY子句(或任何其他子句)进行排序。

例如,文章"the":

  1. 瑞士银行
  2. 美国银行
  3. 英格兰银行

应分类为:

  1. 美国银行
  2. 英格兰银行
  3. 瑞士银行

而非

  1. 美国银行
  2. 瑞士银行
  3. 英格兰银行
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 ', '')

更新:您实际上不需要检查theof是否出现在字段的开头,因为您只想按重要单词排序。例如,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 ', ''))

相关内容

最新更新