2009-08-05 6 views
1

Я использую SQL Server 2008, и я пытаюсь построить запрос для отображения некоторых общих результатов из одной таблицы sql. Я хочу показать count (имя_файла) для каждой даты, например, я хочу знать, как часто имя «izla» повторяется в таблице для каждой даты, но это может быть также «IZLA» или «Izla», поэтому я должен найти способ объединить эти данные вместе и найти счет для трех из них.Sql пытается изменить букву и группу похожих значений nvarchar

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

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

ответ

2

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

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

Спасибо! Это помогает. – Blerta

+0

Вы не имеете в виду Case Intensitive collation? Или мне что-то не хватает в акцентах? – pjp

+0

@pjp, вы правы. Я изменил объяснение. Спасибо за указание на это. –

0

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

+0

Ну, я искал способ, который может решить, что автоматически, потому что это может быть еще одно письмо, кроме формы «я», так что вы не можете просто записать все возможные ситуации. – Blerta

0

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

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

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

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

Роб