SQL截取两个特定值之间的文字

如有数据列T,值为1一别之后2两地相悬3只说是三四月5又谁知五六年……
如何将1、2、3、5之间的值拆分出来,字数不固定,且拆分截断字符也不一定是数字
求高手sql语句写法,最好可以写个函数:
SELECT Fun_Split(T,'3','5') 得出"只说是三四月"
最新回答
烂命

2024-10-17 10:24:17

  sql截取 两个特定值之间的文字
  可以使用substring() 截取 和 charindex()
  CHARINDEX函数调用方法如下:
CHARINDEX ( expression1 , expression2 [ , start_location ] )
Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。

  substring函数调用方法如下:
  substring(string,startNumber, endNumber)

  返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子
字符串

  例子:
  CHARINDEX('SQL', 'Microsoft SQL Server')
这个函数命令将返回在“Microsoft SQL Server”中“SQL”的起始位置,在这个例子中,CHARINDEX函数将返回“S”在“Microsoft SQL Server”中的位置11。

  SubString("12345",2,3)
  调用以下函数返回“2345”:
  假设你要显示Northwind数据库Customer表前5行联系人列的Last Name。这是前5行数据
ContactName
------------------------------
Maria Anders
Ana Trujillo
Antonio Moreno
Thomas Hardy
Christina Berglund
你可以看到,CustomName包含客户的First Name和Last Name,它们之间被一个空格隔开。我用CHARINDX函数确定两个名字中间空格的位置。通过这个方法,我们可以分析ContactName列的空格位置,这样我们可以只显示这个列的last name部分。这是显示Northwind的Customer表前5行last name的记录!
select top 5 substring(ContactName,charindex(’ ’,ContactName)+1 ,
len(ContactName)) as [Last Name] from Northwind.dbo.customers
下面是这个命令输出的结果。
Last Name
------------------------------
Anders
Trujillo
Moreno
Hardy
Berglund
时间曼妙

2024-10-17 08:44:41

你如果只要指定字符之间的,那么直接截取就行了啊
sqlserver:
select substring(t,charindex('3',t)+1,charindex('5',t)-charindex('3',t)-1)
追问
数字之间是可以的,但如果是英文或者汉字,应如何截取?
例如:T值为“一别之后 两地相悬 只说是三四月 又谁知五六年”
任意截取两个字或者两个词之间的文字,
如:截取“两地”、“三四”之间的文字,输出结果为“相悬 只说是”
追答
select substring(t,charindex('两地',t)+2,charindex('三四',t)-charindex('两地',t)-2)
追问
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
追答
上面长度计算是根据你给的例子,除非你全部列都含有例子中的字样,不然不能通用
可以用case when语句加以判断截取