我在数据库中有一个表,其中存在列名,我想将该名称字段中的值更新为“标题”大小写。
示例:
"abc asd"
至"Abc Asd"
考虑到表中有数百万条记录,我想知道使用SQL进行此操作的最佳方法是什么。
答案 0 :(得分:2)
数据卫生是一场持续不断的战斗。适当的案例从来没有像人们想象的那么简单。在野外使用数据时,存在许多变体和不一致之处。
此处是一项功能,如有必要,可以对其进行扩展。
全面披露:还有许多其他性能更高的功能,但是它们往往采用了过于简化的方法。
示例
Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
('old mcdonald'),
('dr. Langdon ,dds'),
('b&o railroad'),
('john-m-smith'),
('CARSON/jACOBS'),
('jAmes o''neil')
Select *
,ProperCase = [dbo].[svf-Str-Proper](SomeCol)
From @YourTable
返回
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
感兴趣的UDF
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')
答案 1 :(得分:1)
对于 basic 示例,使用诸如Jeff Moden's之类的理货表字符串拆分器,或者使用您想要的拆分函数代替下面的my_project
,可以将它们拆分为固定好箱子后,将它们塞回一起。请注意,使用这种类型的拆分函数比通常看到的RBAR(while循环等)方法要快。
DelimitedSplit8K()