Различение между «AB» и «Ab» в поле базы данных персонажа - PullRequest
3 голосов
/ 04 февраля 2009

В частности, Sql Server 2005 / T-Sql. У меня есть поле, состоящее в основном из двух символов, и все они должны быть в верхнем регистре, но есть некоторые устаревшие данные, которые предшествуют текущей БД / системе, и мне нужно выяснить, какие записи нарушают верхний регистр завет обсадной колонны.

Я думал, что это будет работать:

select * from tbl where ascii(field1) <> ascii(upper(field1))

И действительно, это вернуло мне несколько записей. С тех пор они были исправлены, и теперь этот запрос не возвращает данных. Но есть люди, которые говорят мне, что в БД все еще есть смешанные данные о случаях, и я только что нашел пример: «FS» и «Fs» сообщают об одном и том же значении ascii.

Почему этот подход некорректен? Что может быть лучше для этого, или как я могу исправить этот подход для правильной работы?

Ответы [ 7 ]

5 голосов
/ 04 февраля 2009

, если вся дата должна быть в верхнем регистре, просто обновите

update tbl
set field1 = upper(field1)

но чтобы ответить на ваш оригинальный вопрос, этот запрос должен дать вам ожидаемые результаты:

select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)

Редактировать: только что заметил, что предложение использовать COLLATE было также опубликовано Ian

3 голосов
/ 04 февраля 2009

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

Вы можете изменить параметры сортировки на уровне всей базы данных или только на один столбец для конкретного запроса, поэтому:

SELECT myColumn 
  FROM myTable  
  WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
2 голосов
/ 04 февраля 2009

Функция ascii () вернет число ascii для первого символа в выражении, если вы передадите ему строку из нескольких символов. Чтобы сделать сравнение, которое вы хотите, вам нужно смотреть на отдельные символы, а не на целые поля.

1 голос
/ 04 февраля 2009

Методы, описанные в Поиск с учетом регистра в запросах SQL Server может быть полезным для вас.

1 голос
/ 04 февраля 2009

Это может сработать:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
1 голос
/ 04 февраля 2009

Функция ASCII () возвращает только кодовое значение ASCII самого левого символа символьного выражения. Вместо этого используйте UPPER ().

0 голосов
/ 04 февраля 2009

Согласно документации для ASCII(), возвращается только самый левый символ.

Я думаю, вы ошибаетесь. Вы могли бы просто:

select * from tbl where field1 <> upper(field1)

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

select * from tbl where
          (field1 collate Latin1_General_CS_AS)
  <> upper(field1 collate Latin1_General_CS_AS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...