分享几个高级的字符处理函数
会在第二个字符表达式中搜索一个字符表达式,这将返回第一个表达式(如果发现存在)的开始位置。
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
注:这是一个常用的字符搜索函数,起始下标是1,不是0。
如果加了起始下标,会从忽略起始下标前面的字符,往后面搜索。
不加起始值示例
SELECT CHARINDEX('数据',
'SQL数据库开发SQL数据库开发')
结果
添加起始值示例
SELECT CHARINDEX('数据',
'SQL数据库开发SQL数据库开发',6)
结果
以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。它会用第一个函数参数中指定的分隔符分隔连接的字符串值。(CONCAT_WS 指示使用分隔符连接。)
CONCAT_WS ( separator, argument1, argument2 [, argumentN]... )
注:CONCAT_WS 会忽略列中的 NULL 值。用 ISNULL 函数包装可以为 null 的列,并提供默认值。
示例
SELECT CONCAT_WS('-','SQL',
'数据库',NULL,'开发')
结果:
返回使用指定格式和可选区域性格式化的值。使用 FORMAT 函数将日期/时间和数字值格式化为识别区域设置的字符串。对于一般的数据类型转换,请使用 CAST 或 CONVERT。
FORMAT ( value, format [, culture ] )
注意:
日期格式示例
DECLARE @d DATETIME = '7/25/2024';
SELECT FORMAT(@d,'d','en-US') AS '美国格式'
,FORMAT(@d,'d','en-gb') AS '英国格式'
,FORMAT(@d,'d','de-de') AS '德国格式'
,FORMAT(@d,'d','zh-cn') AS '中文格式';
SELECT FORMAT(@d,'D','en-US') AS '美国格式'
,FORMAT(@d,'D','en-gb') AS '英国格式'
,FORMAT(@d,'D','de-de') AS '德国格式'
,FORMAT(@d,'D','zh-cn') AS '中文格式';
结果
自定义格式示例
SELECT FORMAT( GETDATE(),
'dd/MM/yyyy', 'zh-cn' ) AS '自定义日期'
,FORMAT(123456789,
'###-##-####') AS '自定义数字';
结果
数值格式示例
SELECT FORMAT(1.127456,
'N','zh-cn') AS '四舍五入格式'
,FORMAT(1.123456,
'G', 'zh-cn') AS '一般格式'
,FORMAT(1.123456,
'C', 'zh-cn') AS '货币格式'
结果
返回模式在指定表达式中第一次出现的起始位置;如果在所有有效的文本和字符数据类型中都找不到该模式,则返回零。该函数与CHARINDEX比较相似
PATINDEX ( '%pattern%' , expression )
注意
示例
SELECT PATINDEX('%数据库%', 'SQL数据库开发');
结果
在 PATINDEX 中使用通配符示例
使用 % 和 _ 通配符查找模式 '数'(后跟任意一个字符和 '库')在指定字符串中的开始位置(索引从 1 开始)
SELECT PATINDEX('%数_库%', 'SQL数据库开发');
结果
以指定的次数重复字符串值。
REPLICATE ( string_expression ,integer_expression )
示例
SELECT '2'+REPLICATE ('3',5)
结果
返回字符串值的逆序。
REVERSE ( string_expression )
示例
SELECT REVERSE('SQL数据库开发')
结果
串联字符串表达式的值,并在其间放置分隔符值。不能在字符串末尾添加分隔符。
STRING_AGG ( expression, separator ) [ <order_clause> ]
注意
示例
WITH t AS (
SELECT '张三' Name,'语文' Course,89 Score
UNION ALL
SELECT '张三' ,'数学' ,91
UNION ALL
SELECT '李四' ,'语文' ,78
UNION ALL
SELECT '李四' ,'数学' ,96
)
SELECT Name,
STRING_AGG(Course,',') Course ,
STRING_AGG(Score,',') Score
FROM t
GROUP BY Name
结果
一个表值函数,它根据指定的分隔符将字符串拆分为子字符串行。
STRING_SPLIT ( string , separator )
注意
示例一
SELECT Value FROM
STRING_SPLIT('SQL-数据库-开发', '-');
结果
示例二
WITH t AS (
SELECT 1 ID,'张三' Name,
'足球,篮球,羽毛球' Hobby
UNION ALL
SELECT 2 ,'李四','足球,游泳,爬山'
)
SELECT ID, Name, Value
FROM t
CROSS APPLY STRING_SPLIT(Hobby, ',');
结果
注意:返回的列不再是Hobby,而是Value,必须写成Value,否则得不到想要的结果。这个与STRING_AGG()函数的功能相反。
STUFF 函数将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符;然后将第二个字符串插入到第一个字符串的开始位置。
STUFF ( character_expression , start , length , replaceWith_expression )
注意
示例
SELECT STUFF('abcdef', 2, 3, 'ijklmn');
结果