首页 > 解决方案 > 提取两个字符之间的某些文本

问题描述

我有一个nvarchar字符串,我需要从中提取字符之间的某些文本。

例子:1.abc.5,m001-1-Exit,822-FName-18001233321--2021-09-23 13:53:10 Thursday-m001-1-Exit-Swipe,Card NO: 822User ID: FNameName: 18001233321Dept: Read Date: 2021-09-23 13:53:10 ThursdayAddr: m001-1-ExitStatus: Swipe,07580ec2000002a52E917D0000000000372BA56E11010000

我需要的:

| Name     | Phone Number   |    
| -------- | -------------- |    
| FName    | 1800123321     |

我的尝试:

SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX ('-', col))) + 1, LEN(col) - LEN(LEFT(col,      CHARINDEX ('-', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('-', col))) - 1);

标签: sqlsql-servertsql

解决方案


单程:

  • 使用patindex查找“FName-”
  • 删除字符串的开头,直到并包括“FName-”
  • 用于patindex查找“--”
  • 从“--”中删除字符串的其余部分

您可以将查询合并到一行,但您会发现自己重复了部分逻辑——我希望避免这种情况。一次计算一件事使调试更容易。

select
  A.Col
  , B.StringStart
  , C.NewString
  , patindex('%--%',C.NewString) NewStringEnd
  , substring(C.NewString,1,patindex('%--%',C.NewString)-1) -- <- Required Result
from (
  values
  (N'1.abc.5,m001-1-Exit,822-FName-18001233321--2021-09-23 13:53:10 Thursday-m001-1-Exit-Swipe,Card NO:    822User ID:     FNameName:  18001233321Dept:    Read Date:  2021-09-23 13:53:10 ThursdayAddr:   m001-1-ExitStatus:  Swipe,07580ec2000002a52E917D0000000000372BA56E11010000')
) A (Col)
cross apply (
  values
  (patindex('%FName-%',Col))
) B (StringStart)
cross apply (
  values
  (substring(A.Col,B.StringStart+6,len(A.Col)-B.StringStart-6))
) C (NewString);

推荐阅读