CHARINDEX替换函数
时间: 2023-10-18 17:48:05 浏览: 90
SQL Server的CHARINDEX函数是用来查找一个字符串中某个子字符串的位置的函数。它的语法如下:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
其中,expressionToFind是要查找的子字符串,expressionToSearch是要在其中查找的字符串,start_location是可选的,表示从哪个位置开始查找。如果找到了子字符串,则返回它在字符串中的位置,否则返回。
相关问题
sql server 字符串替换函数
SQL Server 提供了几个用于字符串替换的内置函数,主要包括 `REPLACE()`、`PATINDEX()` 和 `STRING_ESCAPE()` 函数。以下是它们的简介:
1. **REPLACE()** 函数:
- 这个函数用于将字符串中的某个子串替换为另一个指定的子串。语法是:`REPLACE(str, search_value, replace_with)`. 例如:`SELECT REPLACE('Hello World', 'World', 'Universe')` 返回 'Hello Universe'。
2. **PATINDEX()** 函数:
- 结合 `CHARINDEX()` 函数一起使用,可以在字符串中查找特定子串的位置,然后用 `REPLACE()` 替换。先找到位置,再用新的值替换。
例子:`SELECT REPLACE('Hello World', SUBSTRING(@str, PATINDEX('%World%', @str), LEN(@str)), '')`.
3. **STRING_ESCAPE()** 函数(仅在某些版本中可用):
- 如果需要处理特殊字符以便于查询,如在正则表达式中,可以使用此函数将字符转义。例如:
```sql
SELECT STRING_ESCAPE(N'Hello "World"', N'\')
```
请注意,SQL Server还支持更复杂的模式匹配和替换功能,比如 `LIKE` 和 `REGEXP_REPLACE`(在某些扩展包中),后者在更现代的版本中可用于正则表达式的替换操作。
使用SUBSTRING、CHARINDEX、LEN等函数,写一个sql server查询,不能使用string_split函数。在名为AKSW的数据库中有MeetItem20200119表,表中有JoinName列,MsterName列和MeetSummaryName列,这三列中有若干人员姓名且多个姓名之间用逗号隔开,统计这三列中每个名字的出现次数并把其在这三列的出现次数展示出来。
可以使用 SUBSTRING、CHARINDEX、LEN 等函数配合使用,编写 SQL 查询语句来实现该需求。具体实现方法如下:
```
SELECT Name, SUM(CASE WHEN JoinName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS JoinNameCount,
SUM(CASE WHEN MsterName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MsterNameCount,
SUM(CASE WHEN MeetSummaryName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MeetSummaryNameCount
FROM (
SELECT SUBSTRING(','+JoinName+',', Number+1, CHARINDEX(',', ','+JoinName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+JoinName+',')-1
UNION ALL
SELECT SUBSTRING(','+MsterName+',', Number+1, CHARINDEX(',', ','+MsterName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MsterName+',')-1
UNION ALL
SELECT SUBSTRING(','+MeetSummaryName+',', Number+1, CHARINDEX(',', ','+MeetSummaryName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MeetSummaryName+',')-1
) AS Names
GROUP BY Name
```
上述 SQL 查询语句首先使用了三个 UNION ALL 子句,将 JoinName、MsterName 和 MeetSummaryName 中所有的姓名拆分成单个的姓名,生成一个 Name 的临时表。
然后使用了 SUM、CASE WHEN 等函数,将每个姓名在三列中出现的次数统计出来,并分别计算出在 JoinName、MsterName 和 MeetSummaryName 列中的出现次数。
最后使用 GROUP BY 子句,将姓名进行分组,将每个姓名的出现次数展示出来。
需要注意的是,由于没有使用 string_split 函数,因此需要使用 CROSS JOIN master..spt_values 生成一个数字表,用于拆分字符串。另外,需要将 AKSW 替换成实际的数据库名。
阅读全文