Sql 用条件将每个单词的第一个字母大写
我有一个文本,看起来像供应商公司(GA/ATL)。我想让它看起来像供应商公司(GA/ATL) 因此,我只想将每个单词的第一个字母大写,除了那些位于Sql 用条件将每个单词的第一个字母大写,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个文本,看起来像供应商公司(GA/ATL)。我想让它看起来像供应商公司(GA/ATL) 因此,我只想将每个单词的第一个字母大写,除了那些位于(和)之间的单词 我遇到了-UPPER(左(字段名称,1))+LOWER(子字符串(字段名称,2,LEN(字段名称)),但它一次只处理一个单词,没有我想要的功能。最需要的是一个能完成这项工作的功能。试着这样使用: BEGIN DECLARE @Index INT DECLARE @Char CHAR(1) DEC
(
和)
之间的单词
我遇到了-UPPER(左(字段名称,1))+LOWER(子字符串(字段名称,2,LEN(字段名称))
,但它一次只处理一个单词,没有我想要的功能。最需要的是一个能完成这项工作的功能。试着这样使用:
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @PrevChar CHAR(1)
DECLARE @OutputString VARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 1
WHILE @Index <= LEN(@InputString)
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1)
SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
ELSE SUBSTRING(@InputString, @Index - 1, 1)
END
IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
BEGIN
IF @PrevChar != '(' AND @PrevChar != '/'
SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
IF @PrevChar = '('
SET @OutputString = LEFT(@OutputString, LEN(@OutputString) - LEN(SUBSTRING(@OutputString, CHARINDEX('(',@OutputString), CHARINDEX(')',@OutputString)))) + UPPER(SUBSTRING(@OutputString, CHARINDEX('(',@OutputString), CHARINDEX(')',@OutputString)))
END
SET @Index = @Index + 1
END
RETURN @OutputString
END
输出
Vendor Corporation (GA/ATL)
试着这样使用:
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @PrevChar CHAR(1)
DECLARE @OutputString VARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 1
WHILE @Index <= LEN(@InputString)
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1)
SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
ELSE SUBSTRING(@InputString, @Index - 1, 1)
END
IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
BEGIN
IF @PrevChar != '(' AND @PrevChar != '/'
SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
IF @PrevChar = '('
SET @OutputString = LEFT(@OutputString, LEN(@OutputString) - LEN(SUBSTRING(@OutputString, CHARINDEX('(',@OutputString), CHARINDEX(')',@OutputString)))) + UPPER(SUBSTRING(@OutputString, CHARINDEX('(',@OutputString), CHARINDEX(')',@OutputString)))
END
SET @Index = @Index + 1
END
RETURN @OutputString
END
输出
Vendor Corporation (GA/ATL)
使用Jeff Moden拆分器(可在此处找到)可以实现这一点。然后,您需要使用交叉表(也称为条件聚合)将该部分重新组合起来。您也可以使用PIVOT来实现这一点,但我发现交叉表在语法方面不那么迟钝,而且它已被证明在性能方面稍快一些。这也使用了这里的InitCap函数 如果您事先不知道您将拥有多少“单词”,您可以将此交叉表调整为动态版本。您可以在此处阅读有关动态交叉表的更多信息 --编辑-- 感谢JamieD77对使用STUFF的建议。我特别喜欢这个选项,因为我有另一个版本的InitCap,它使用一个计数表,而不是这里引用的版本,它使用while循环。使用STUFF有助于将整个过程转化为一个内联表值函数,因此速度会非常快。如果有人想看到没有循环的InitCap,让我知道,我会很乐意发布它 下面是使用建议的STUFF方法的查询
SELECT STUFF((SELECT ' ' + s.CorrectedVal
FROM sortedValues s
ORDER BY s.ItemNumber
FOR
XML PATH('')
),1,1,'')
使用Jeff Moden拆分器(可在此处找到)可以实现这一点。然后,您需要使用交叉表(也称为条件聚合)将该部分重新组合起来。您也可以使用PIVOT来实现这一点,但我发现交叉表在语法方面不那么迟钝,而且它已被证明在性能方面稍快一些。这也使用了这里的InitCap函数 如果您事先不知道您将拥有多少“单词”,您可以将此交叉表调整为动态版本。您可以在此处阅读有关动态交叉表的更多信息 --编辑-- 感谢JamieD77对使用STUFF的建议。我特别喜欢这个选项,因为我有另一个版本的InitCap,它使用一个计数表,而不是这里引用的版本,它使用while循环。使用STUFF有助于将整个过程转化为一个内联表值函数,因此速度会非常快。如果有人想看到没有循环的InitCap,让我知道,我会很乐意发布它 下面是使用建议的STUFF方法的查询
SELECT STUFF((SELECT ' ' + s.CorrectedVal
FROM sortedValues s
ORDER BY s.ItemNumber
FOR
XML PATH('')
),1,1,'')
作为上述答案的替代方案。如果您只想忽略
(
和)
之间的内容,您可以使用这个稍加修改的函数版本
如果您总是想在
(
和)
中对所有内容进行封顶,只需在这两个位置使用设置@OutputString=STUFF(@OutputString,@Index,1,UPPER(@Char))
,作为上述答案的替代方法。如果您只想忽略(
和)
之间的内容,您可以使用这个稍加修改的函数版本
如果您总是想在
(
和)
中对所有内容进行封顶,只需在这两个位置使用SET@OutputString=STUFF(@OutputString,@Index,1,UPPER(@Char))
,我认为您需要编写一个用户定义的函数来实现这个非常特定的目的。您可以从触发器调用它,确保存储的数据始终具有正确的格式。此函数称为InitCap。您需要调整一个解决方案,如回答句柄parensI我认为您需要为此编写一个用户定义的函数。您可以通过触发器调用该函数,以确保存储的数据始终具有正确的格式。该函数称为InitCap。你需要调整一个解决方案,就像这个答案中的handle parens需要更多的工作来处理,除了那些在(和)
之间的单词,只是一个提示。。当我意识到(
和)
之后的单词没有被正确处理后,我不得不编辑我的答案。您的函数还将把'VENDOR CORPORATION(GA/ATL)duhh duhh'
转换为'VENDOR CORPORATION(GA/ATL)duhh duhh'
不确定这是否为issue@JamieD77这不是一个问题,因为我的字符串在之后没有任何文本。
但是很聪明的观察!需要更多的工作来处理,除了那些在(和)
之间存在的单词,只是一个提示。。当我意识到(
和)
之后的单词没有被正确处理后,我不得不编辑我的答案。您的函数还将把'VENDOR CORPORATION(GA/ATL)duhh duhh'
转换为'VENDOR CORPORATION(GA/ATL)duhh duhh'
不确定这是否为issue@JamieD77这不是一个问题,因为我的字符串在之后没有任何文本。
但是很聪明的观察@JamieD77我非常喜欢这个东西选项。我有另一个InitCap函数,我使用它不使用循环,它是基于计数表的,所以使用这样的东西会使所有东西都没有任何循环。我会用这个更新我的答案。@JamieD77我非常喜欢这个东西选项。我有另一个InitCap函数,我使用它不使用循环,它是基于计数表的,所以使用这样的东西会使所有东西都没有任何循环。我会更新我的答案。你让它看起来很简单。回答得很好。你让它看起来很简单。回答得很好。
SELECT [dbo].[InitCap](n)
FROM ( VALUES ( 'VENDOR CORPORATION (GA/ATL)'),
( 'VENDOR CORPORATION (ga/atl)'),
( 'VENDOR CORPORATION (Ga/Atl)') ) t (n)
output
--------
Vendor Corporation (GA/ATL)
Vendor Corporation (ga/atl)
Vendor Corporation (Ga/Atl)