Sql Server,按第1,第2和第3空间拆分字符串

时间:2015-02-11 12:25:38

标签: sql sql-server-2008

下面的图像指定了我想要实现的目标。基本上我有两列,需要三个基于这两列的额外计算列。

  1. Split1 =产品名称后的第一个字词
  2. Split2 =产品名称后的2个字
  3. Split3 =产品名称后的3个字
  4. image for what I need

    修改

    e.g

    产品名称:

    博世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
    

2 个答案:

答案 0 :(得分:1)

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

测试表和数据:

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

答案 1 :(得分:0)

希望这会对你有所帮助。

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*/