【问题标题】:Return a SUBSTRING with a known Prefix and Suffix Character返回具有已知前缀和后缀字符的 SUBSTRING
【发布时间】:2017-05-08 06:07:05
【问题描述】:

我有一个表,它有一个始终以. 结尾的可变长度前缀和一个始终以- 开头的可变长度后缀。 - 也可以在我正在查找的文本字符串中找到,因此使用 REVERSE() 可能是识别后缀 - 的最佳方法。

例如:Prefix1.ABC-123-Suffix1

我希望 SUBSTRING() 结果看起来像:ABC-123

我能够创建一个 SUBSTRING() 来删除前缀和一个 SUBSTRING() 来删除后缀,但是我很难同时应用这两者。返回的文本可以是可变长度的。

我试图避免声明一个变量,但我对此持开放态度。如果可能,我宁愿只使用 SUBSTRING()、REVERSE() 和 CHARINDEX()。

这是我目前所拥有的:

SELECT [Col1]
       ,SUBSTRING((Col1),CHARINDEX('.', (Col1)) + 1, 999) AS [StrippedPrefix]
       ,REVERSE(SUBSTRING(REVERSE(Col1),CHARINDEX('-', REVERSE(Col1)) + 1, 999)) AS [StrippedSuffix]

--new SUBSTRING() with both Prefix and Suffix stripped

FROM [Table1]

【问题讨论】:

  • 这是什么 SQL 变体?
  • 我正在使用 SSMS 2016

标签: sql sql-server tsql substring


【解决方案1】:

这里的变量仅用作演示 - 也应与您的表格一起使用:

DECLARE @s nvarchar(100) = 'Prefix1.ABC-123-Suffix1'

SELECT @s,
       SUBSTRING(@s, 1, CHARINDEX('.', @s)-1) StrippedPrefix,
       SUBSTRING(@s, LEN(@s)-CHARINDEX('-', REVERSE(@s))+2, CHARINDEX('-', REVERSE(@s))) StrippedSuffix,
       SUBSTRING(@s, CHARINDEX('.', @s)+1, LEN(@s)-CHARINDEX('.', @s)-CHARINDEX('-', REVERSE(@s))) NewString

【讨论】:

  • Msg 155, Level 15, State 2, Line 2 'NVARCHAR' 不是公认的 CURSOR 选项。
  • 这里让我感到困惑的是,@s 变量。我在哪里定义列? Column 从未在上述查询中的 select 语句中定义。
  • 代替@s,使用包含字符串的列
【解决方案2】:

这是一种方法

DECLARE @str VARCHAR(100)= 'Prefix1.ABC-123-Suffix'

SELECT Reverse(Stuff(intr_str, 1, Charindex('-', intr_str), ''))
FROM   (SELECT Reverse(Stuff(@str, 1, Charindex('.', @str), '')) AS intr_str) a 

结果: ABC-123

【讨论】:

  • 我收到了同样的结果
【解决方案3】:
Declare @YourTable table (Col1 varchar(50))
Insert Into @YourTable values
('Prefix1.ABC-123-Suffix1')

Select *
      ,String=Substring(Col1,charindex('.',Col1)+1,len(Col1)-charindex('.',Col1)-charindex('-',reverse(Col1)))
 From  @YourTable

返回

Col1                       String
Prefix1.ABC-123-Suffix1    ABC-123

按照M阿里的建议(更好)

Select *
      ,String=PARSENAME(REPLACE(Col1 , '-', '.') , 3) + '-' + PARSENAME(REPLACE(Col1 , '-', '.') , 2) 
 From  @YourTable

【讨论】:

  • @DataMan31 乐于助人
  • 另一种方式可能是PARSENAME(REPLACE(Col1 , '-', '.') , 3) + '-' + PARSENAME(REPLACE(Col1 , '-', '.') , 2) from @YourTable :)
  • @M.Ali 更好!很惭愧我错过了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多