Sql 服务器,将字符串拆分为第 1、第 2 和第 3 space
Sql Server, Split string by 1st, 2nd and 3rd space
下图说明了我要实现的目标。基本上我有两列,需要基于这两列的三个额外的计算列。
- Split1 = 产品名称中品牌后的第一个词
- Split2 = 产品名称中品牌后的 2 个词
- 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
下图说明了我要实现的目标。基本上我有两列,需要基于这两列的三个额外的计算列。
- Split1 = 产品名称中品牌后的第一个词
- Split2 = 产品名称中品牌后的 2 个词
- 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