SomeCol ProperCase
old mcdonald Old McDonald
dr. Langdon ,dds Dr. Langdon ,DDS
b&o railroad B&O Railroad
john-m-smith John-M-Smith
CARSON/jACOBS Carson/Jacobs
jAmes o'neil James O'Neil
用户自定义项(如果感兴趣)
CREATE FUNCTION [dbo].[svf-Str-Proper] (@S varchar(max))
Returns varchar(max)
As
Begin
Set @S = ' '+Replace(Replace(Lower(@S),' ',' '),' ',' ')+' '
;with cte1 as (Select * From (Values(' '),('-'),('/'),('\'),('['),('{'),('('),('.'),(','),('&'),(' Mc'),(' O''')) A(P))
,cte2 as (Select * From (Values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M')
,('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')
,('LLC'),('PhD'),('MD'),('DDS')
) A(S))
,cte3 as (Select F = Lower(A.P+B.S),T = A.P+B.S From cte1 A Cross Join cte2 B )
Select @S = replace(@S,F,T) From cte3
Return rtrim(ltrim(@S))
End
-- Syntax : Select [dbo].[svf-Str-Proper]('old mcdonald phd,dds llc b&o railroad')
declare @table table (v varchar(4000))
insert into @table
values
('abc abc abc'),
('Def abc ABC'),
('qrs ABC abc'),
('tuv'),
(' this is an odd-string# that3 has some 435 in it. It has leading and trailing spaces? ')
select distinct
*
,STUFF((
SELECT ' ' + upper(left(lower(rtrim(ltrim(x.Item))),1)) + right(lower(rtrim(ltrim(x.Item))),len(rtrim(ltrim(x.Item))) - 1)
from @table t
cross apply DelimitedSplit8K(rtrim(ltrim(v)),' ') x
where t.v = b.v
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from @table b
3条答案
按热度按时间4c8rllxm1#
数据卫生是一场持续的战斗。正确的情况永远不像人们想象的那么简单。在使用来自野外的数据时,会有许多变化和不一致。
这里有一个功能,如果需要可以扩展。
**完全公开:**还有许多其他性能更高的函数,但它们的方法往往过于简单。
示例
退货
用户自定义项(如果感兴趣)
x6yk4ghg2#
对于 basic 示例,使用计数表字符串拆分器(如Jeff Moden's),或者使用任何您想要的拆分函数来代替下面的
DelimitedSplit8K()
,您可以在空格上拆分它们,然后在修复正确的大小写后将它们重新填充在一起。注意,使用这种类型的拆分函数比常见的RBAR(while循环等)方法更快。DEMO
rekjcdws3#
我将Customer_Name以大写形式存储。示例:穆罕默德·麦金太尔
我不得不返回它在标题的情况下/正确的情况。例如:穆罕默德·麦金太尔
我在MySql中使用了以下代码。
CHECK HERE