使用 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
我想使用函数将我的字符串转换为 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