Собственный / заглавный случай в т-sql - PullRequest
4 голосов
/ 07 марта 2012

Я использую SQL 2012 RC0 и ищу функцию, которая может преобразовать столбец с именами и фамилиями в собственно / заглавный регистр. Я осмотрелась ТАК, но не могу ничего найти, если есть еще один пост, пожалуйста, дайте мне знать, и я закрою этот.

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

Кто-нибудь знает, как это сделать в t-sql? Есть ли в SQL 2012 какие-либо строковые функции для этого? Или я должен искать способ сделать это с помощью хранимой процедуры CLR (C #)?

Ответы [ 2 ]

6 голосов
/ 07 марта 2012

Правильный случай - это то, что так сложно понять правильно.Думайте имена как Ван дер Вилден и ВанВик.Я написал функцию T-SQL несколько лет назад, но кроме SQLR, в SQL Server 2012 нет ничего нового, что могло бы помочь с этим:

http://web.archive.org/web/20120215192418/http://classicasp.aspfaq.com/general/how-do-i-convert-a-name-to-proper-case.html

PS почему вы до сих пор используете RC0?RTM (11.0.2100) был выпущен сегодня ...

0 голосов
/ 09 мая 2016

Если у вас установлен MDS (SQL 2005 и более поздние версии), вы можете правильно обрабатывать регистр с помощью регулярных выражений.

Вам потребуется добавить еще немного для обработки упомянутого «Van der Wilden», но этоможет быть расширен даже для этого.

CASE 
WHEN mds.mdq.RegexIsMatch([First Name],'[A-Z]{1,}(\s|\-)[A-Z]{2,}',7)=1 THEN

UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7),1,1))+lower(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)(\s|\-)','First',7))-1))
+ mds.mdq.RegexExtract([First name],'(?<Sep>(\s|\-))','Sep',7) + SUBSTRING(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7),1,1)+ LOWER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7),2,LEN(mds.mdq.RegexExtract([First Name],'(\s|\-)(?<MI>.*)','MI',7))-1))

WHEN mds.mdq.RegexIsMatch([First Name],'[A-Z]{1,}\s[A-Z]{1}',7)=1 THEN

UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7),1,1))+
lower(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)\s','First',7))-1))
+ ' ' + mds.mdq.RegexExtract([First Name],'\s(?<MI>.*)','MI',7)+'.'
ELSE
UPPER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7),1,1))+
LOWER(SUBSTRING(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7),2,LEN(mds.mdq.RegexExtract([First Name],'(?<First>.*)','First',7))-1))
END 
,
[Last Name]=CASE
WHEN mds.mdq.RegexIsMatch([Last Name],'(\s|\-)',7)=1
THEN
SUBSTRING(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7),1,1)+LOWER(SUBSTRING(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7),2,LEN(mds.mdq.RegexExtract([Last Name],'(?<Maiden>.*)(\s|\-)','Maiden',7))-1))+
mds.mdq.RegexExtract([last name],'(?<Sep>(\s|\-))','Sep',7)+
SUBSTRING(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7),1,1)+LOWER(SUBSTRING(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7),2,LEN(mds.mdq.RegexExtract([Last Name],'(\s|\-)(?<Maiden>.*)','Maiden',7))-1))
Else
SUBSTRING([Last Name],1,1) +LOWER(SUBSTRING([last name],2,LEN([Last Name])-1))
END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...