我想使用函数将字符串转换为sql中的相反大小写。 有人可以帮我吗?
我可以输入字符串的第一个字母,但不能输入中间的字母
http://www.sql-server-helper.com/functions/initcap.aspx
示例:
输入: “我的名字叫乔”
输出: “嗨,我的nAME是jOE”
答案 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