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

Change the casing of my letters in string using sql function

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

我能做字符串的第一个字母但不能做中间字母

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

示例:

输入: "hI mY Name IS Joe"

输出: "Hi My nAME is jOE"

完全基于集合的方法:

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;

简而言之:

使用即时计数(在这种情况下,ROW_NUMBER() 与任何更大的集合相比,我们得到运行 从 1 到 n 的数字,其中 n 是字母的数量。

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

第三个应用程序将通过对二进制表示进行异或并重新设置重要的 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))。我把它放在一边是为了展示它是如何工作的。

如果你的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