Sql 服务器,将字符串拆分为第 1、第 2 和第 3 space

Sql Server, Split string by 1st, 2nd and 3rd space

下图说明了我要实现的目标。基本上我有两列,需要基于这两列的三个额外的计算列。

  1. Split1 = 产品名称中品牌后的第一个词
  2. Split2 = 产品名称中品牌后的 2 个词
  3. Split3 = 产品名称中品牌后的 3 个词

编辑

例如

产品名称:

博世 Rotak 320ER 电动旋转割草机

品牌

博世

现在我想要产品名称中的三个子字符串。

第一 - Rotak(品牌名称后的第一个词)

第二个 - Rotak 320ER(品牌名称后面的两个词)

第三 - Rotak 320ER Electric(品牌名称后面的三个词)

我希望这能阐明我在寻找什么。

我目前的尝试如下所示。但似乎 parsename 仅适用于有效的 sql 标识符,所以我不得不放弃这个想法。

select 
PARSENAME(temp.tempname, 1),
PARSENAME(temp.tempname, 2),
PARSENAME(temp.tempname, 3),
temp.tempname
from(
    select product_name, brand,
    replace(substring(product_name,CHARINDEX(brand, product_name) + LEN(brand) + 1, 10000), ' ', '.') as tempname
    from Products 
    where products.product_id = 1298665
) temp

希望对您有所帮助。

DECLARE @str1 VARCHAR(100)
DECLARE @str2 VARCHAR(100)
DECLARE @str3 VARCHAR(100)

DECLARE @some VARCHAR(max)
DECLARE @some1 VARCHAR(max)
DECLARE @some2 VARCHAR(max)

DECLARE @length INT
DECLARE @index INT 

--SET @index = 0
SET @some = 'Vijay Dinanath Chauhan'
SET @length = LEN(@some)

SET @index = CHARINDEX(' ',@some,0)
SET @str1 =  SUBSTRING(@some,0,@index)
SET @some1 = SUBSTRING(@some,@index,@length)
--SELECT @str1,@index AS [FirstIndex],ltrim(@some1)

SET @index = CHARINDEX(' ',@some1,@index)
SET @str2 =  SUBSTRING(@some1,0,@index)
SET @some2 = SUBSTRING(@some1,@index,@length)
--SELECT @str2,@index AS [SecondIndex],ltrim(@some2)
SET @str3 = ltrim(@some2)



SELECT @str1,@str2,@str3*/

好的,我现在明白问题了。我假设数据在一个表格中,所以我发明了另一行,我使用 CROSS APPLY 在空格处拆分行,并使用 PIVOT 再次合并它们:

测试table和数据:

DECLARE @t table(ProductName varchar(200), brand varchar(20))

INSERT @t values('Bosch Rotak 320ER Electric Rotary Lawnmower', 'Bosch')
INSERT @t values('Bosch Rotak 320ER Electric Rotary Lawnmower', 'Rotak')

查询:

;WITH CTE AS
(
  SELECT 
    (row_number()  over (order by (select 1))-1) / 3 id, 
    productname, 
    brand, 
    (row_number() over (order by (select 1)) -1)% 3 + 1 position,
    substring(x, 0, y.number) substr
  FROM @t
  CROSS APPLY
  (
    SELECT stuff(ProductName, 1, charindex(brand, ProductName) + len(brand), '') x
  ) x
  CROSS APPLY
  (
    SELECT top 3 number FROM master..spt_values
    WHERE 
      type = 'P' and 
      number > 0 and 
      substring(x.x, number, 1) = ' '
  ) y
)
SELECT productname, brand, [1] split1, [2] split2, [3] split3
FROM CTE
PIVOT (max(substr) FOR [position] IN ([1], [2], [3])) AS pvt 

结果:

productname                   brand  split1  split2         split3
Bosch Rotak 320ER Electric..  Bosch  Rotak   Rotak 320ER    Rotak 320ER Electric
Bosch Rotak 320ER Electric..  Rotak  320ER   320ER Electric 320ER Electric Rotary