2011-03-02 358 views
8

我不想創建該自定義函數,如果有任何已經存在的SQL Server有沒有任何SQL Server內置函數來轉換駝峯大小寫字符串?

輸入字符串:This is my string to convert
預期輸出:This Is My String To Convert

+1

從技術上講,這將是PascalCase。 – Thomas 2011-03-02 06:37:23

+3

@thomas,從技術上說它既不是,它只是一串大寫的詞 – 2011-03-02 06:52:11

+0

@nathan gonzalez-我站好了。 – Thomas 2011-03-02 07:14:14

回答

6

據我所知,SQL Server沒有內置功能爲了這。
你必須爲它編寫自定義函數。

試試這個。

CREATE FUNCTION [dbo].[CamelCase] 
(@Str varchar(8000)) 
RETURNS varchar(8000) AS 
BEGIN 
    DECLARE @Result varchar(2000) 
    SET @Str = LOWER(@Str) + ' ' 
    SET @Result = '' 
    WHILE 1=1 
    BEGIN 
    IF PATINDEX('% %',@Str) = 0 BREAK 
    SET @Result = @Result + UPPER(Left(@Str,1))+ 
    SubString (@Str,2,CharIndex(' ',@Str)-1) 
    SET @Str = SubString(@Str, 
     CharIndex(' ',@Str)+1,Len(@Str)) 
    END 
    SET @Result = Left(@Result,Len(@Result)) 
    RETURN @Result 
END 

輸出:

Input String : 'microSoft sql server' 
Output String : 'Microsoft Sql Server' 
+0

不錯,但只能處理空格作爲分隔符。例如,不會處理Dashes /連字符,但仍然可以回答這個問題。也不會處理NULL,而是返回一個空字符串。 – MikeTeeVee 2013-11-27 06:39:03

+0

也不處理單個字母字符串(即第一個中間姓氏作爲單獨的字符串):dbo.CamelCase(p.FirstName),dbo.CamelCase(p.LastName),dbo.CamelCase(p.MiddleName) – mmv1219 2016-09-09 18:56:40

21
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[InitCap] (@InputString varchar(4000)) 
RETURNS VARCHAR(4000) 
AS 
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 != '''' OR UPPER(@Char) != 'S' 
      SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) 
    END 

    SET @Index = @Index + 1 
END 

RETURN @OutputString 

END 



Declare @str nvarchar(100) 
SET @str = 'my string to convert' 
SELECT @str = [dbo].[InitCap](@str) 
SELECT @str 
6

我不得不去與 「不,不存在」。這基於幾年的時間來細讀T-SQL中的可用字符串函數和SQL Server 2008 R2中一些相當近期的5天課程。

當然,我仍然可能是錯的:)。

2

我的策略

  • 如果名字已經在混合的情況下,相信這是正確的。
  • 如果名稱不混合的情況下,然後執行以下操作:
  • 修剪了名字,以消除空白
  • 帳戶與「MC」開頭的名字,如「McDavid」
  • 帳戶與像奧賴利
  • 賬戶複姓名字(結婚的名字)「安德森 - 約翰遜」撇號
  • 帳戶像「拉魯薩」
  • 多字名的名字使包含在名稱字段確定後綴適當資本

這一守則

這是我原來的職位:Converting String to Camel Case in SQL Server

CREATE FUNCTION [dbo].[GetCamelCaseName] 
(
    @Name varchar(50) 
) 
RETURNS VARCHAR(50) WITH SCHEMABINDING 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @NameCamelCase VARCHAR(50) 

    -- This is determining whether or not the name is in camel case already (if the 1st character is uppercase 
    -- and the third is lower (because the 2nd could be an apostrophe). To do this, you have to cast the 
    -- character as varbinary and compare it with the upper case of the character cast as varbinary. 

    IF (CAST(SUBSTRING(@Name, 1,1) as varbinary) = CAST(SUBSTRING(UPPER(@Name), 1, 1) as varbinary)   
      AND ((CAST(SUBSTRING(@Name, 2,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 2, 1) as varbinary) 
        AND SUBSTRING(@Name, 2,1) != '''') 
       or 
       (CAST(SUBSTRING(@Name, 4,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 4, 1) as varbinary) 
        AND SUBSTRING(@Name, 2,1) = ''''))) 

     BEGIN 
      SELECT @NameCamelCase = RTRIM(LTRIM(@Name)) 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')   
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')  
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald') 

      if (@NameCamelCase LIKE '% iv') -- avoid changing "Ivan" to "IVan" 
       SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV') 

      if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv')) 
       SELECT @NameCamelCase = UPPER(@NameCamelCase) 

      RETURN @NameCamelCase  

     END 

    ELSE 

     BEGIN  

      SELECT @NameCamelCase = RTRIM(LTRIM(@Name)) 

      -- "Mc-" 
      SELECT @NameCamelCase = 
       CASE 
        WHEN @Name LIKE 'mc%' 
         THEN UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 1)) + UPPER(SUBSTRING(@Name, 3, 1)) + LOWER(SUBSTRING(@Name, 4, 47)) 
        ELSE 
         UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 49)) 
       END 

      -- Apostrophes 
      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '%''%' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('''', @NameCamelCase) - 1) + '''' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 


      -- Hyphenated names (do it twice to account for double hyphens) 
      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '%-%' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 

      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '%-%' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 

      SELECT @NameCamelCase = REPLACE(@NameCamelCase, '^', '-') 

      -- Multiple word names (do it twice to account for three word names) 
      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '% %' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 

      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '% %' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 

      SELECT @NameCamelCase = REPLACE(@NameCamelCase, '?', ' ') 

      -- Names in Parentheses   
      SELECT @NameCamelCase = 
       CASE 
        WHEN @NameCamelCase LIKE '%(%' 
         THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('(', @NameCamelCase) - 1) + '(' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 2, 50) 
        ELSE 
         @NameCamelCase 
       END 


      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')   
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')   
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ') 
      SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald') 

      if (@NameCamelCase LIKE '% iv') 
       SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV') 

      if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv')) 
       SELECT @NameCamelCase = UPPER(@NameCamelCase) 

      -- Return the result of the function 
      RETURN ISNULL(@NameCamelCase, '') 

     END 

    RETURN ISNULL(@NameCamelCase, '') 

END 
+0

我喜歡在哪裏你要這樣做。但是,這段代碼在SQL Server 2008 R2下沒有執行。錯誤是「必須聲明標量變量」@NameCamelCase「。」。 – 2011-10-27 03:57:31

+0

謝謝。我試圖讓它更簡單一些,錯過了一些東西。正在更新... – Narnian 2011-10-27 13:06:17

2

如果操作的目的是美化名稱,然後適當的資本可以被定義爲第一串由非字母字符分隔的每個單詞的字母。

其他解決方案沒有考慮到:

  1. 保留間距(尤其是尾部空格)。
  2. 保留NULL,空字符串或一串空格。
  3. 處理的不僅僅是空格(例如破折號,逗號,下劃線等)
  4. 處理單詞/標記之間的多個非字母字符。
  5. 處理例外情況(例如,像「James William III」中的McDonald或III)。

注意:我的解決方案不處理異常。
如果你非常關心這些,那麼我建議你爲這些編寫一個CLR C#程序集,因爲它會很棘手,字符串是C#擅長的領域。
這裏的另一個解決方案試圖解釋這一點,但它仍然需要「 ivan糟糕的輸出」並輸出「** IV ***一個可怕的IV *」。

這是我想出了以下功能:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fs_PascalCase]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[fs_PascalCase] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[fs_PascalCase] 
(
    @Text nVarChar(MAX) 
) 
RETURNS nVarChar(MAX) 
AS 
BEGIN 
     SET @Text = LOWER(@Text)--This step is optional. Keep if you want the code below to control all casing. - 11/26/2013 - MCR. 
    DECLARE @New nVarChar(MAX) = (CASE WHEN @Text IS NULL THEN NULL ELSE '' END)--Still return null when source is null. - 11/26/2013 - MCR. 
    DECLARE @Len Int = LEN(REPLACE(@Text, ' ', '_'))--If you want to count/keep trailing-spaces, you MUST use this!!! - 11/26/2013 - MCR. 
    DECLARE @Index Int = 1--Sql-Server is 1-based, not 0-based. 
    WHILE (@Index <= @Len) 
     IF (SUBSTRING(@Text, @Index, 1) LIKE '[^a-z]' AND @Index + 1 <= @Len)--If not alpha and there are more character(s). 
      SELECT @New = @New + UPPER(SUBSTRING(@Text, @Index, 2)), @Index = @Index + 2 
     ELSE 
      SELECT @New = @New +  SUBSTRING(@Text, @Index, 1) , @Index = @Index + 1 

    --If @Text is null, then @Len will be Null, and everything will be null. 
    --If @Text is '', then (@Len - 1) will be -1, so ABS() it to use 1 instead, which will still return ''. 
    RETURN (UPPER(LEFT(@New, 1)) + RIGHT(@New, ABS(@Len - 1))) 
END 
GO 


你叫它像這樣:

SELECT dbo.fs_PascalCase(NULL)[Null], 
     dbo.fs_PascalCase('')[EmptyString], 
     dbo.fs_PascalCase('hello how are-you TODAY ')[LongString] 


輸出將是這樣的:

PascalCase Output

-3

這裏是簡單的事情,不要讓它變得複雜。選擇initcap(lower('This is MY striNg to conVerT'))FROM dual;

+1

問題是關於sqlserver而不是oracle。 – Nezam 2015-04-23 11:17:08

相關問題