Сортировка (или использование предложения ORDER BY) в T-SQL / SQL SERVER без учета некоторых слов - PullRequest
3 голосов
/ 30 января 2012

Мне интересно, можно ли использовать предложение ORDER BY (или любое другое предложение) для сортировки без учета некоторых слов.

Например, статья 'the':

  1. Банк Швейцарии
  2. Банк Америки
  3. Банк Англии

следует отсортировать по:

  1. Банк Америки
  2. Банк Англии
  3. Банк Швейцарии

и НЕ

  1. Банк Америки
  2. Банк Швейцарии
  3. Банк Англии

Ответы [ 5 ]

2 голосов
/ 30 января 2012
select * from #test
order by
case when test like 'The %' then substring(test, 5, 8000) else test end
2 голосов
/ 30 января 2012

Нет, не совсем, потому что 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 не должен делать его выбранным после ).

2 голосов
/ 30 января 2012

Вам необходимо закодировать метод преобразования одной строки в другую, а затем упорядочить по ней.

Например, если метод состоит в том, чтобы просто убрать начальные вхождения '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
2 голосов
/ 30 января 2012

Если у вас есть ограниченное количество слов, которые вы хотите исключить, вы можете удалить их, используя REPLACE, например:

ORDER BY REPLACE(REPLACE(' ' + Column + ' ',' the ',' '),' and ',' ')

Однако, как количество словдобавьте, вы будете иметь все больше и больше вложенных REPLACE звонков.Кроме того, этот ORDER BY не сможет извлечь выгоду из каких-либо индексов и не справится со знаками препинания.

Если этот тип встречается часто, а запросы в противном случае могли бы извлечь выгоду из индекса, выможет рассмотреть возможность сделать вышеупомянутый вычисляемый столбец и создать индекс по нему (Вы затем упорядочите по вычисляемому столбцу).

1 голос
/ 30 января 2012

Мое решение немного короче

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 ', ''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...