SQL 常见函数整理 _ CHARINDEX()

1. 用法
用于查找一个字符串在另一个字符串中第一次出现的位置(索引)。它返回一个整数值表示第一次出现的位置。

2. 基本语法

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

参数说明:
expressionToFind:必需,要查找的字符串。
expressionToSearch:必需,要进行查找的字符串表达式。
start_location:可选,指定搜索的起始位置,默认为1。如果指定了起始位置,则从该位置开始搜索。

3. 应用示例
1.返回表达式的起始位置

declare @sql varchar(50)
select @sql = '摇摇晃晃的人间'
select charindex('晃',@sql)
----返回结果:3

2.从指定位置搜索

declare @sql varchar(50)
select @sql  = '鱼翅与花椒'+'你的舌苔或空空荡荡'
select charindex('或',@sql,3)
----返回结果:10
----需要注意的是,虽然从第三位开始搜索,但是位置还是从1开始计算的

3.搜索不存在的表达式

declare @sql varchar(50)
select @sql  = '鱼翅与花椒'+'你的舌苔或空空荡荡'
select charindex('飘',@sql,3)
----返回结果:0

4.执行区分大小写的搜索

select charindex('TEST','This is a Test'COLLATE Latin1_General_CS_AS)
----返回结果:0
select charindex('Test','This is a Test'COLLATE Latin1_General_CS_AS)
----返回结果:11

5.执行不区分大小写的搜索

SELECT CHARINDEX ( 'TEST',  
       'This is a Test'  
       COLLATE Latin1_General_CI_AS); 
  1. 使用charindex 函数进行分列
--建表
--StudentInfo 记录学生所选选修课,已知一名学生不能选超过3门选修课。
if object_id('StudentInfo','U') IS NOT NULL DROP TABLE StudentInfo
go
create table StudentInfo(
     StudentID     int
    ,StudentName  varchar(20)
    ,Course        varchar(200)
)
go
insert into StudentInfo
values
 (1,'Emma','拉丁,排球')
,(2,'Alex','围棋,街舞,曲棍球')
,(3,'Joe','演讲,乒乓球')
,(4,'Lily','太极')
,(5,'Zoe','击剑,跆拳道,街舞')
,(6,'Miya','法语')
go
--查询
select StudentID,StudentName,Course
,case when charindex(',',Course ,1 ) = 0 then  Course else   substring(Course,1 ,charindex(',',Course ,1 )-1)  end  as 选修课1
,case when charindex(',',Course ,1 ) = 0 then null
      when charindex(',',Course,charindex(',',Course,1)+1)  = 0 then  substring(Course,charindex(',',Course,1) +1  ,len(Course))
    else substring(Course,charindex(',',Course,1) +1  ,charindex(',',Course,charindex(',',Course,1)+1)-1  -   charindex(',',Course,1))
    end  as 选修课2
,case when charindex(',',Course ,1 ) = 0 then null
      when charindex(',',Course,charindex(',',Course,1)+1)  = 0  then null
      when charindex(',',Course,charindex(',',Course,charindex(',',Course,1))+1)  = 0
          then  substring(Course,charindex(',',Course,charindex(',',Course,1)+1) +1  ,len(Course))
    else substring(Course,charindex(',',Course,charindex(',',Course,1)+ 1 ) +1  ,len(Course) -   charindex(',',Course,charindex(',',Course,1 ) +1))
    end  as 选修课3
from StudentInfo
<think>好的,我现在需要解决用户的问题:如何用SQL Server的RIGHT和CHARINDEX函数从字符串'3.75/4.05/0.3'中提取最后一个斜杠后的内容'0.3'。首先,我应该回顾一下用户提供的引用资料,看看有没有相关的方法。 根据引用[1],用户提到使用CHARINDEX和REVERSE组合来获取字符最后一次出现的位置。例如,要找到最后一个括号的位置,可以通过反转字符串,找到第一个出现的字符,再计算原始位置。同样的方法可能适用于斜杠的情况。 用户的问题是要用RIGHT和CHARINDEX,不过引用里更多是用SUBSTRING和CHARINDEX的组合,比如引用[4]中的例子。但用户特别要求使用RIGHT函数,所以需要调整思路。 首先,我需要找到最后一个斜杠的位置。使用CHARINDEX直接找可能只能找到第一个出现的,所以需要用REVERSE函数反转字符串,找到第一个斜杠的位置,再转换为原始字符串中的位置。例如,原字符串是'3.75/4.05/0.3',反转后是'3.0/50.4/57.3',然后查找第一个斜杠的位置,假设是第4个字符,那么原始字符串中的位置就是总长度减去这个位置。 接下来,使用RIGHT函数从字符串末尾截取这个位置之后的字符。总长度可以通过LEN函数获取,然后减去反转后找到的位置,再减1,可能?需要具体计算。 比如,原字符串长度是13,反转后的斜杠位置是4,那么原始位置是13 - 4 = 9。所以从位置9+1开始取右边的字符,即RIGHT(string, LEN(string) - 9)。不过可能需要验证这个计算是否正确。 另外,用户提供的例子中引用[1]的代码可能类似:CHARINDEX('/', REVERSE(string)),然后用这个值来确定位置。然后RIGHT(string, pos - 1)或者类似的方式。 让我再仔细看一下引用[1]中的方法:“获取字符最后一次出现的位置,最后一个括号内的内容。使用函数CHARINDEX,REVERSE组合。”例如,对于字符串反转后查找字符的位置,然后用原始长度减去该位置得到最后一个出现的位置。 所以步骤应该是: 1. 反转字符串,找到第一个斜杠的位置。 2. 原始字符串中最后一个斜杠的位置是原始长度减去反转后的位置。 3. 使用RIGHT函数截取从该位置+1到末尾的部分。 例如,原字符串长度是L,反转后的斜杠位置为P,则最后一个斜杠的位置是L - P +1?或者需要调整?比如,反转后的位置是P,那么原始的位置应该是L - P +1?或者可能要看具体的索引方式。例如,原字符串是'abc/def',反转是'fed/cba',反转后的第一个斜杠位置是4,那么原字符串中的位置是原长度(7) - 4 +1 = 4?原字符串中的斜杠位置是第4个字符吗?比如原字符串是a b c / d e f,索引为1到7,那么斜杠在第4位。反转后是f e d / c b a,斜杠在第4位,所以原位置应该是7 -4 +1 =4。所以正确。因此,最后一个斜杠的位置是:CHARINDEX('/', REVERSE(string)),假设得到P,那么原位置是 LEN(string) - P +1。不过这可能要测试。 然后,使用RIGHT函数,从字符串右边截取的长度应该是总长度减去原位置的值。例如,原位置是pos,那么要取右边部分的长度是LEN(string) - pos。比如,原字符串是'3.75/4.05/0.3',假设pos是最后一个斜杠的位置,比如是第9位,那么右边部分从第10位开始,长度是总长度13 -9 =4,即取4个字符,即'0.3'。 不过需要确认是否正确。比如,原字符串的长度是13,最后一个斜杠的位置是第9位,那么右边的字符数应该是13 -9 =4,所以RIGHT(string,4)就是0.3吗?原字符串是'3.75/4.05/0.3',最后的部分是'0.3',长度为3,所以可能哪里出错了? 或者可能我的计算有误。假设反转后的字符串是'3.0/50.4/57.3',那么反转后的第一个斜杠的位置是4。原字符串长度是13。那么原位置是13 -4 +1=10?这样RIGHT(string, LEN(string) -10) =13-10=3,所以RIGHT(string,3)就是0.3? 这可能正确。比如,原字符串的第10位是斜杠,那么从第10位之后取右边3位,即最后三位是0.3。那可能RIGHT的第二个参数是字符数,所以需要LEN(string) - pos。例如,pos是最后一个斜杠的位置,那么从pos+1开始到末尾的长度是总长度 - pos,所以RIGHT(string, 总长度 - pos)。这样,假设总长度是13,pos是10,那么13-10=3,RIGHT(str,3)得到最后的三个字符,即0.3。 所以具体步骤: 1. 反转字符串,找到第一个斜杠的位置,记为rev_pos。 2. 原字符串中最后一个斜杠的位置为orig_pos = LEN(string) - rev_pos +1。 3. 使用RIGHT函数,截取的长度为LEN(string) - orig_pos,即 RIGHT(string, LEN(string) - orig_pos)。 或者,可以简化为:反转后的位置是rev_pos,则要截取的长度是rev_pos -1。因为反转后的字符串中第一个斜杠的位置是rev_pos,那么原字符串中最后一个斜杠后的字符数是rev_pos -1。例如,反转后的字符串中第一个斜杠在位置4,那么原字符串最后一个斜杠后的字符数是4-1=3,即RIGHT(string,3)得到0.3。这似乎更简单,对吗? 例如,反转后的字符串是'3.0/50.4/57.3',反转后的斜杠在位置4,那么要截取的长度是4-1=3。RIGHT(string,3)就是0.3。这应该是对的。 所以最终的SQL语句可能为: SELECT RIGHT('3.75/4.05/0.3', CHARINDEX('/', REVERSE('3.75/4.05/0.3')) -1 ) 这样,REVERSE字符串后找到第一个斜杠的位置,即4,然后取原字符串的右边4-1=3位,即0.3。 那这样是否可行?需要测试一下。 例如,假设原字符串是'3.75/4.05/0.3',反转后是'3.0/50.4/57.3',用CHARINDEX('/',反转后的字符串)得到4。然后RIGHT(原字符串,4-1)=RIGHT('...',3)得到最后三个字符,即'0.3'。这应该正确。 所以这样就能用RIGHT和CHARINDEX结合REVERSE来获取最后一个斜杠后的内容。虽然用户可能没有提到REVERSE,但根据引用[1],这是可行的方法。 总结步骤: 1. 使用REVERSE函数反转字符串。 2. 使用CHARINDEX查找反转后的字符串中第一个斜杠的位置。 3. 用RIGHT函数截取原字符串,长度为步骤2得到的值减1。 因此,最终的SQL语句应该是: SELECT RIGHT('3.75/4.05/0.3', CHARINDEX('/', REVERSE('3.75/4.05/0.3')) -1 ) 或者对于变量: DECLARE @str VARCHAR(50) = '3.75/4.05/0.3' SELECT RIGHT(@str, CHARINDEX('/', REVERSE(@str)) -1 ) 这样就能得到'0.3'。这样符合用户的要求,使用了RIGHT和CHARINDEX函数,同时结合了REVERSE,如引用[1]所述。 另外,需要确认当字符串中没有斜杠时的情况。例如,如果字符串是'abc',则CHARINDEX返回0,RIGHT函数参数会是-1,这会导致错误。所以可能需要处理这种情况,但用户的问题中可能假设至少有一个斜杠,或者可以添加CASE WHEN判断,但用户的问题可能不需要考虑这个情况,所以可以暂时忽略。 综上,我认为正确的解决方案是使用RIGHT函数结合CHARINDEX和REVERSE来获取最后一个斜杠后的内容。</think>要使用 SQL Server 的 `RIGHT` 和 `CHARINDEX` 函数从字符串 `'3.75/4.05/0.3'` 中提取最后一个斜杠后的内容 `'0.3'`,可以按以下步骤操作: ### 解决方法 1. **反转字符串**:使用 `REVERSE` 函数将原字符串反转,将最后一个斜杠变为第一个斜杠。 2. **定位反转后的斜杠位置**:通过 `CHARINDEX` 找到反转字符串中第一个斜杠的位置。 3. **计算截取长度**:反转后的斜杠位置减 1,即为需要截取的字符数。 4. **提取目标内容**:用 `RIGHT` 函数从原字符串末尾截取指定长度的字符。 ```sql SELECT RIGHT('3.75/4.05/0.3', CHARINDEX('/', REVERSE('3.75/4.05/0.3')) - 1); ``` ### 分步说明 1. **反转字符串**: `REVERSE('3.75/4.05/0.3')` 结果为 `'3.0/50.4/57.3'`。 2. **查找反转后的斜杠位置**: `CHARINDEX('/', '3.0/50.4/57.3')` 返回 `4`(第一个斜杠的位置)。 3. **计算截取长度**: 长度为 `4 - 1 = 3`。 4. **提取内容**: `RIGHT('3.75/4.05/0.3', 3)` 截取最后 3 个字符,结果为 `'0.3'`。 ### 增强健壮性 若字符串中可能不包含斜杠,可通过 `CASE` 语句处理异常: ```sql DECLARE @str VARCHAR(50) = '3.75/4.05/0.3'; SELECT CASE WHEN CHARINDEX('/', @str) > 0 THEN RIGHT(@str, CHARINDEX('/', REVERSE(@str)) - 1) ELSE @str END AS Result; ``` ### 原理解释 - `REVERSE` 将字符串反转后,最后一个斜杠变为第一个,便于用 `CHARINDEX` 快速定位[^1]。 - `RIGHT` 函数从右侧截取指定长度的字符,结合计算出的长度,可精准提取目标内容[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值