Преобразование базы данных верхнего регистра в правильный регистр - PullRequest
2 голосов
/ 01 июня 2011

Я новичок в SQL, и у меня есть несколько больших баз данных с именами в верхнем регистре и фамилиями, которые мне нужно преобразовать в соответствующий регистр в SQL Server 2008.

Для этого я использую следующее:

update database 
Set FirstNames = upper(substring(FirstNames, 1, 1))
                     + lower(substring(FirstNames, 2, (len(FirstNames) - 1) ))

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

Я просмотрел другие ответы в этом поле, и все они, кажется, перестали работать, по сравнению с запросом выше.

Также есть ли какой-нибудь способ помочь в конвертации Максуранмес (я вручную заменю остальные)? MCDONALD для McDonald, опять же, я просто использую запрос about, но заменяю FirstNames на LastName.

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Может быть, это слишком долго, но это очень просто и может быть адаптировано для -, ' и т. Д .:

UPDATE tbl SET LastName = Case when (CharIndex(' ',lastname,1)<>0) then (Upper(Substring(lastname,1,1))+Lower(Substring(lastname,2,CharIndex(' ',lastname,1)-1)))+ 
 (Upper(Substring(lastname,CharIndex(' ',lastname,1)+1,1))+
 Lower(Substring(lastname,CharIndex(' ',lastname,1)+2,Len(lastname)-(CharIndex(' ',lastname,1)-1)))) 
  else (Upper(Substring(lastname,1,1))+Lower(Substring(lastname,2,Len(lastname)-1))) end, 
FirstName = Case when (CharIndex(' ',firstname,1)<>0) then (Upper(Substring(firstname,1,1))+Lower(Substring(firstname,2,CharIndex(' ',firstname,1)-1)))+ 
 (Upper(Substring(firstname,CharIndex(' ',firstname,1)+1,1))+
 Lower(Substring(firstname,CharIndex(' ',firstname,1)+2,Len(firstname)-(CharIndex(' ',firstname,1)-1)))) 
  else (Upper(Substring(firstname,1,1))+Lower(Substring(firstname,2,Len(firstname)-1))) end;
1 голос
/ 01 июня 2011

Это, вероятно, лучше всего делать вне SQL. Тем не менее, если есть требование сделать это на сервере или если скорость не является проблемой (потому что это будет проблемой, поэтому вам нужно выяснить, если вы заботитесь), то способ, которым вы идете по этому поводу, вероятно, является лучшим способ сделать это. Если хотите, вы можете создать UDF, который поместит всю логику в одну область.

Вот код, с которым я столкнулся (с указанием авторства и дополнительной информацией под ним):

CREATE FUNCTION dbo.fCapFirst(@input NVARCHAR(4000)) RETURNS NVARCHAR(4000)
AS 
BEGIN
DECLARE @position INT
WHILE IsNull(@position,Len(@input)) > 1
SELECT @input = Stuff(@input,IsNull(@position,1),1,upper(substring(@input,IsNull(@position,1),1))), 
@position = charindex(' ',@input,IsNull(@position,1)) + 1
RETURN (@input)
END

--Call it like so
select dbo.fCapFirst(Lower(Column)) From MyTable

Я получил этот код от http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=37760 На этом форуме также есть дополнительная информация и другие предложения.

Что касается случаев, подобных Макдональду, я бы предложил один из двух способов справиться с этим. Можно было бы выполнить поиск в вышеуказанной UDF по ключевым словам («Макдональд», «МакГрю» и т. Д.) Или по шаблонам (первые две буквы - «Мак», затем заглавная, и т. Д.). Второй способ: поместить эти случаи (полные имена) в таблицу и заменить их значения во втором столбце. Тогда просто сделайте замену. Скорее всего, однако, будет проще определить правила, такие как Mc, затем использовать заглавные буквы, а не пытаться перечислить каждую возможность фамилии.

Не забывайте, что вы можете изменить вышеуказанный UDF, чтобы он включал в себя тире, а не только пробелы.

0 голосов
/ 01 июня 2011

Тони Роджерсон имеет код, который имеет дело с:

  • именами с двойными бочками, например, Артур Бентли-Смайт
  • Контрольные символы

Я сам этим не пользовался ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...