Функция T-Sql для преобразования varchar - в данном случае чьего-либо имени - из верхнего регистра в заглавный? - PullRequest
5 голосов
/ 20 июля 2010

Кто-нибудь имеет в своем заднем кармане функцию, которая может этого добиться?

Ответы [ 6 ]

3 голосов
/ 20 июля 2010

Нашел это здесь : -

create function ProperCase(@Text as varchar(8000))
returns varchar(8000)
as
begin
   declare @Reset bit;
   declare @Ret varchar(8000);
   declare @i int;
   declare @c char(1);

   select @Reset = 1, @i=1, @Ret = '';

   while (@i <= len(@Text))
    select @c= substring(@Text,@i,1),
               @Ret = @Ret + case when @Reset=1 then UPPER(@c) else LOWER(@c) end,
               @Reset = case when @c like '[a-zA-Z]' then 0 else 1 end,
               @i = @i +1
   return @Ret
end

Результаты этого: -

select dbo.propercase('ALL UPPERCASE');  -- All Uppercase
select dbo.propercase('MiXeD CaSe'); -- Mixed Case
select dbo.propercase('lower case'); -- Lower Case
select dbo.propercase('names with apostrophe - mr o''reilly  '); -- Names With Apostrophe - Mr O'Reilly
select dbo.propercase('names with hyphen - mary two-barrels  '); -- Names With Hyphen - Mary Two-Barrels
2 голосов
/ 20 июля 2010

Я бы сделал это вне TSQL, в коде вызова tbh. например если вы используете .NET, это просто случай TextInfo.ToTitleCase .

Таким образом, вы оставляете код форматирования вне TSQL (стандартный подход «пусть вызывающая сторона решает, как использовать / форматировать данные»).

1 голос
/ 20 июля 2010

Без курсоров, без циклов while, без (встроенных) подзапросов

-- ===== IF YOU DON'T HAVE A NUMBERS TABLE =================
--CREATE TABLE Numbers (
--   Num INT NOT NULL PRIMARY KEY CLUSTERED WITH(FILLFACTOR = 100)
--)
--INSERT INTO Numbers
--SELECT TOP(11000)
--   ROW_NUMBER() OVER (ORDER BY (SELECT 1))
--FROM master.sys.all_columns a
--   CROSS JOIN master.sys.all_columns b

DECLARE @text VARCHAR(8000) = 'my text to make title-case';
DECLARE @result VARCHAR(8000);

SET @result = UPPER(LEFT(@text, 1));

SELECT
   @result += 
      CASE 
      WHEN SUBSTRING(@text, Num - 1, 1) IN (' ', '-') THEN UPPER(SUBSTRING(@text, Num, 1)) 
      ELSE SUBSTRING(@text, Num, 1) 
      END
FROM Numbers
WHERE Num > 1 AND Num <= LEN(@text);

PRINT @result;
1 голос
/ 20 июля 2010

Если вы действительно хотите сделать это в T-SQL и без цикла, см. Статью Тони Роджерсона " Превращение вещей в" Camel Case "без циклов "

Я не пробовал ... вот для чего клиентский код: -)

1 голос
/ 20 июля 2010

Этот тип функции лучше выполнять на стороне приложения, поскольку он будет работать относительно плохо в SQL.

В SQL-Server 2005 и выше вы можете написать функцию CLR, которая делает это, и вызывать ее из своего SQL. Здесь - статья о том, как это сделать.

0 голосов
/ 20 июля 2010

Будет ли какая-либо строка содержать только имя или фамилию, которую вы хотите преобразовать, или она будет содержать полные имена, разделенные пробелами?Кроме того, есть ли какие-либо другие правила, которые вы хотите, какие символы должны «верхний» или нижний »?

Если вы можете гарантировать, что это только имя и фамилия, и вы не имеете дело с какой-либо специальной заглавной буквы, такой какпосле апострофа, может ли это сделать то, что вы ищете?

    SELECT  -- Initial of First Name
        UPPER(LEFT(FullName, 1))
        -- Rest of First Name
        + SUBSTRING(LOWER(FullName), 2, CHARINDEX(' ', FullName, 0) - 2) 
        -- Space between names
        + ' ' 
        -- Inital of last name
        + UPPER(SUBSTRING(FullName, CHARINDEX(' ', FullName, 0) + 1, 1)) 
        -- Rest of last name
        + SUBSTRING(LOWER(FullName), CHARINDEX(' ', FullName, 0) + 2, LEN(FullName) - CHARINDEX(' ', FullName, 0) + 2)
FROM Employee
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...