在' - '字符之后和之前获取子字符串

时间:2018-03-15 01:24:11

标签: sql sql-server

我在表格中有这种字符串:

  • AM-65-800
  • AM-75 / 86-650
  • d-27-600

我想要做的只是获得中间部分,例如:

  • 65
  • 86分之75
  • 27

基本上是' - 'Char

之前和之后的子串

我试过这个(来自这里的一个例子):

SELECT SUBSTRING(Product.Name, LEN(LEFT(Product.[Name], CHARINDEX ('-', Product.[Name]))) + 1, LEN(Product.[Name]) - LEN(LEFT(Product.[Name], CHARINDEX ('-', Product.[Name]))) - LEN(RIGHT(Product.[Name], LEN(Producto.[Name]) - CHARINDEX ('-', Product.[Name]))) - 1)
FROM Product

但它给了我这个错误:

[42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid length parameter passed to the LEFT or SUBSTRING function. (537)

说实话,我不知道如何解决错误,因为我不理解示例中的解决方案。我该怎么办?

感谢。

3 个答案:

答案 0 :(得分:4)

一个选项是ParseName()

示例

Declare @S varchar(max)='AM-65-800'

Select parsename(replace(@S,'-','.'),2)

<强>返回

65

答案 1 :(得分:1)

使用SUBSTRING,根据“ - ”的位置计算起点和长度:

SELECT SUBSTRING('ABC-65-DEF', 
                 CHARINDEX('-', 'ABC-65-DEF') + 1, 
                 CHARINDEX('-', 'ABC-65-DEF', CHARINDEX('-', 'ABC-65-DEF') + 1) - CHARINDEX('-', 'ABC-65-DEF') - 1)

基本上,它找到' - '(CHARINDEX('-', 'ABC-65-DEF'))的第一个实例,然后是' - '(CHARINDEX('-', 'ABC-65-DEF', CHARINDEX('-', 'ABC-65-DEF') + 1))的第二个实例,并在中间抓取子串。

答案 2 :(得分:0)

这将有助于找到旧版SQL Server的中间部分,包括2008年。

DECLARE @SomeText VARCHAR(100) = 'AM-75/86-650'
SELECT LEFT(RIGHT(@SomeText, LEN(@SomeText) - CHARINDEX('-', @SomeText)),  
           CHARINDEX('-', RIGHT(@SomeText, LEN(@SomeText) - CHARINDEX('-', @SomeText)))-1)

返回:'75 / 86'