我有以下查询为我工作到现在。
with tmp(product_id , Token, product_name) as (
select product_id, cast ( LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)),
STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '')
from Products
union all
select product_id, cast (LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)),
STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '')
from tmp
where product_name > ''
)
select product_id, Token from tmp
按空格分隔产品名称,并作为记录提供给我。
但是现在我不仅需要用空格分隔产品名,还需要用空格、连字符和逗号分隔。我想不出怎样才能做到这一点。
任何形式的帮助总是感激的。
编辑-示例
如果产品表包含以下内容
product_id, product_name
1, JVC-600.BLACK
2, M cb-588
然后我需要
product_id, token
1, JVC
1, 600
1, BLACK
2, M
2, cb
2, 588
结果是。
如果你有一个适用于空格的查询,一个非常简单的修改是将其他字符也设置为空格,例如
with Prod2 as (
select *, product_name2 = replace(replace(product_name,'.',' '),'-',' ')
from products
)
,tmp(product_id , Token, product_name) as (
select product_id, cast ( LEFT(product_name2, CHARINDEX(' ',product_name2+' ')-1) as varchar(100)),
STUFF(product_name2, 1, CHARINDEX(' ',product_name2+' '), '')
from Prod2
union all
select product_id, cast (LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)),
STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '')
from tmp
where product_name > ''
)
select product_id, Token from tmp
通过使用while循环动态传递@var列的值来调整代码,这里dee_split是一个用户定义的函数,在运行此查询之前执行dee_split函数,您需要做的是使用replace函数将所有特殊字符转换为单个字符,然后将其传递给split函数
DROP TABLE #temp;
Create table #temp
(
product_id varchar(10),
product_name varchar(100)
)
Insert into #temp
values
('1','JVC-600.BLACK'),
('2','M cb-588')
Select * from #temp
DECLARE @var VARCHAR(100)
SET @var='JVC-600.BLACK'
Select @var=Replace(Replace(Replace (@var,'-','|'),'.','|'),' ','|')
Select * from dee_split (@var,'|',null)
FUnction dee_split在运行上述查询之前运行这个
CREATE FUNCTION dee_split
(
@str varchar(max),
@spliter char(1),
@colspliter char(1) = null
)
RETURNS @tname TABLE(item VARCHAR(1000),item1 VARCHAR(1000))
AS
BEGIN
DECLARE @string XML
IF LEN(@str)=0
BEGIN
INSERT INTO @tname VALUES(null,null)
RETURN
END
if @colspliter is null
begin
IF CHARINDEX(@spliter,@str,0) <> 0
BEGIN
SELECT @string= CONVERT(XML,'<root1><node>'+REPLACE(@str,@spliter,'</node><node>')+'</node></root1>')
INSERT INTO @tname(item)
SELECT [Value]=T.c.value('.','varchar(20)')
FROM @string.nodes('/root1/node') T(c)
END
end
ELSE
BEGIN
IF @str IS NOT NULL
BEGIN
IF @colspliter IS NOT NULL
SELECT @string= CONVERT(XML,'<root1><r1><node>'+REPLACE(REPLACE(@str,@colspliter,'</node><node1>'),@spliter,'</node1></r1><r1><node>')+'</node1></r1></root1>')
INSERT INTO @tname
SELECT col.value('data(node[1])','varchar(16)') item,
col.value('data(node1[1])','varchar(9)') item1
FROM @string.nodes('root1/r1') AS tbl(col)
END
END
RETURN
END