使用SQL函数更改字符串中字母的大小写

时间:2019-10-18 04:15:39

标签: sql sql-server tsql uppercase lowercase

我想使用函数将字符串转换为sql中的相反大小写。 有人可以帮我吗?

我可以输入字符串的第一个字母,但不能输入中间的字母

http://www.sql-server-helper.com/functions/initcap.aspx

示例:

输入: “我的名字叫乔”

输出: “嗨,我的nAME是jOE”

2 个答案:

答案 0 :(得分:3)

完全基于集合的方法:

DECLARE @TheLinkTable TABLE(ID INT IDENTITY,YourText NVARCHAR(1000));
INSERT INTO @TheLinkTable VALUES('hI mY Name IS Joe');

查询:

WITH cte AS
(
    SELECT t.ID
          ,t.YourText
          ,A.Nmbr 
          ,C.SwitchedLetter
    FROM  @TheLinkTable t
    CROSS APPLY(SELECT TOP(LEN(t.YourText)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values) A(Nmbr)
    CROSS APPLY(SELECT SUBSTRING(t.YourText,A.Nmbr,1)) B(TheLetter)
    CROSS APPLY(SELECT CASE WHEN TheLetter LIKE '[a-zA-Z]' 
                            THEN CHAR(ASCII(TheLetter) ^ 0x20)
                            ELSE CASE WHEN TheLetter=' '  THEN TheLetter END END) C(SwitchedLetter)
)
SELECT cte1.ID
      ,cte1.YourText
      ,(
        SELECT SwitchedLetter AS [*]
        FROM cte cte2
        WHERE cte2.ID=cte1.ID
        ORDER BY cte2.Nmbr
        FOR XML PATH(''),TYPE).value('.','nvarchar(max)'
       )
FROM cte  cte1
GROUP BY cte1.ID,cte1.YourText;

简而言之:

使用动态查询(em)(在这种情况下,将ROW_NUMBER()与带有计算的TOP子句的更大集合进行比较,我们从1得到一个运行数到n,其中n是字母数。

第二个APPLY将分别选择每个字母。

第三个应用程序将通过对二进制表示形式进行XOR运算并重新设置有效的BIT,将字母的大小写从a切换到z。会按原样返回空白。

以下SELECT将按ID分组,并使用相关子查询重新组合字符串。

另一种基于集合的方法意味着递归CTE:

WITH recCTE AS
(
    SELECT 1 AS position
          ,YourText 
          ,CAST(CASE WHEN ASCII(TheLetter) BETWEEN 65 AND 90 THEN LOWER(TheLetter)
                     ELSE CASE WHEN ASCII(TheLetter) BETWEEN 97 AND 122 THEN UPPER(TheLetter) END END AS NVARCHAR(MAX)) AS SwitchLetter
    FROM @TheLinkTable
    CROSS APPLY(SELECT SUBSTRING(YourText,1,1)) A(TheLetter)    

    UNION ALL
    SELECT r.position+1
          ,YourText 
          ,CONCAT(r.SwitchLetter
                  ,CASE WHEN ASCII(TheLetter) BETWEEN 65 AND 90 THEN LOWER(TheLetter)
                        ELSE CASE WHEN ASCII(TheLetter) BETWEEN 97 AND 122 THEN UPPER(TheLetter) 
                                  ELSE TheLetter END END) AS SwitchLetter
    FROM recCTE r
    CROSS APPLY(SELECT SUBSTRING(YourText,r.position+1,1)) A(TheLetter) 
    WHERE r.position<LEN(YourText)
)

SELECT * FROM recCte;

您必须添加WHERE以选择最后一个(例如LEN(SwitchLetter)=LEN(YourText))。我将其放在一边以显示其工作原理。

答案 1 :(得分:3)

如果您的sql-server版本支持(sql-server-2017及更高版本),则可以使用TRANSLATE函数

SELECT TRANSLATE ('hI mY Name IS Joe' COLLATE Latin1_general_CS_AS 
    ,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    ,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') 

结果:

 Hi My nAME is jOE
相关问题