Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用条件将每个单词的第一个字母大写_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 用条件将每个单词的第一个字母大写

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

我有一个文本,看起来像供应商公司(GA/ATL)。我想让它看起来像供应商公司(GA/ATL)

因此,我只想将每个单词的第一个字母大写,除了那些位于
之间的单词

我遇到了-
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)