Sql пытается изменить регистр букв и сгруппировать аналогичные значения nvarchar - PullRequest
1 голос
/ 05 августа 2009

Я использую SQL Server 2008, и я пытаюсь создать запрос для отображения некоторых общих результатов из одной таблицы SQL. Я хочу отобразить счетчик (имя поля) для каждой даты, например, я хочу знать, как часто имя «изла» повторяется в таблице для каждой даты, но это также может быть «ИЗЛА» или «Изла», поэтому я должен найти способ сгруппировать эти данные в один и найти количество для трех из них.

Проблема в том, что если я пытаюсь использовать прописные или строчные буквы, чтобы они автоматически считались одинаковыми, у меня возникает проблема: когда izla преобразуется в верхний, он становится İZLA или, с другой стороны, когда IZLA преобразуется в строчные, он отображается ızla.

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

Ответы [ 3 ]

2 голосов
/ 05 августа 2009

Когда вы группируете, вы должны использовать сортировку с нечувствительностью к акценту. Вы можете добавить это прямо в вашу группу по предложению. Ниже приведен пример:

Declare @Temp Table(Data nvarchar(100))

Insert Into @Temp Values(N'izla')
Insert Into @Temp Values(N'İZLA')
Insert Into @Temp Values(N'IZLA')
Insert Into @Temp Values(N'Izla')

Select  Data, 
        Count(*) 
From    @Temp 
Group By Data

Select  Data Collate Latin1_General_CI_AI, 
        Count(*) 
From    @Temp 
Group By Data Collate Latin1_General_CI_AI

Когда вы запустите этот пример, вы увидите, что первый запрос создает две строки (с количеством 3 и числом 1). Во втором примере для группировки используется нечувствительная к акценту сортировка, поэтому все 4 элемента сгруппированы вместе.

Я использовал Latin1_General_CI_AI в моем примере. Я предлагаю вам изучить параметры сортировки столбца, который вы используете, а затем использовать параметры сортировки, которые наиболее близко соответствуют изменению AS на конце на AI.

0 голосов
/ 05 августа 2009

Все это сводится к сортировке, которая является способом, которым система сортирует строковые данные.

Вы могли бы сказать что-то вроде:

SELECT *, COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AI), COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AS)
FROM yourtable

Это даст вам хорошие цифры о том, сколько раз каждое имя появлялось в различных форматах. Существует множество параметров сортировки, и вы можете искать в Книгах онлайн полный список. Вы также можете быть заинтересованы в Latin1_General_BIN, например.

Rob

0 голосов
/ 05 августа 2009

Попробуйте заменить ı и т. Д. Английским эквивалентом после нижнего регистра

...