如何在sql server中选择3列数据作为单列
我在SQL Server中记录了一个表Kwd_上载:如何在sql server中选择3列数据作为单列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQL Server中记录了一个表Kwd_上载: ID Primary_Kwd Sec_Kwd Main_Kwd 1 Man,One Man,architecture,Boy Arrival,Sigle Man , Business Man ,Male aspirations,One Person 2 Wom
ID Primary_Kwd Sec_Kwd Main_Kwd
1 Man,One Man,architecture,Boy Arrival,Sigle Man , Business Man ,Male aspirations,One Person
2 Woman,attire,Girl Girl,Girls,Female,Blueprint,Carrying, Teenage Girl,Only Girls
3 Grand father,Man,caucasian appearance cheerful, Family,Fatherhood,Family Member, Male Parent,
4 Baby ,clothes,color image growth,Babies,Child,Happiness Children,Toddlers,differential focus,
我想从主要的、次要的、主要的中选择数据,如下所示:
Kwds
man
one man
architecture
boy
arrival
Single man
Business man
Male
.
.
etc
我正在使用以下代码,但这仅适用于一列
SELECT DISTINCT
Split.a.value('.', 'VARCHAR(100)') data
FROM
(SELECT
#temp.PM_AssetID,Cast ('<M>'
+ replace(Replace(#temp.Primary_kwd, ',', '</M><M>'),'&','&')
+ '</M>' AS XML) AS Data
FROM #temp) AS A
CROSS APPLY
Data.nodes ('/M') AS Split(a)
DROP TABLE #temp
请帮助我如何做到这一点。提前感谢。您可以使用UNION删除重复项:
;WITH CtePrimary AS(
SELECT
LTRIM(RTRIM(s.Item)) AS Item
FROM Kwd_UploadRecorded k
CROSS APPLY dbo.DelimitedSplit8K(k.Primary_Kwd, ",") s
),
CteSec AS(
SELECT
LTRIM(RTRIM(s.Item)) AS Item
FROM Kwd_UploadRecorded k
CROSS APPLY dbo.DelimitedSplit8K(k.Sec_Kwd, ",") s
),
CteMain AS(
SELECT
LTRIM(RTRIM(s.Item)) AS Item
FROM Kwd_UploadRecorded k
CROSS APPLY dbo.DelimitedSplit8K(k.Main_Kwd, ",") s
)
SELECT * FROM CtePrimary UNION
SELECT * FROM CteSec UNION
SELECT * FROM CteMain
根据Turophile的评论,您可以在拆分KWD之前先将KWD连接起来,从而摆脱工会
SELECT DISTINCT
LTRIM(RTRIM(s.Item)) AS Item
FROM Kwd_UploadRecorded k
CROSS APPLY dbo.DelimitedSplit8K(k.kPrimary_kwd + ',' + k.Sec_kwd + ',' + k.Main_kwd, ",") s
您必须创建一个Spit函数并使用Cross-Aplly
主查询
分割函数代码
你能试试这个吗
Select *
from #temp
cross apply fnSplit(Primary_Kwd,',')a
where a.value > ''
union all
Select b.value
from #temp
cross apply fnSplit(Sec_Kwd,',')b
where b.value > ''
union all
Select c.value
from #temp
cross apply fnSplit(Main_Kwd,',')c
where c.Value > ''
编写一个基于逗号分割值的函数,然后尝试使用union all在上面的列上使用该函数。请参阅我已经使用分割函数的更新问题。但这只适用于@AzarCan的一列,您可以查看上面的评论。我要求您在这两列上都应用此选项,并使用union all来获得所需的结果集,即选择函数col1 union all Select function col2无法获得@Azar:无论查询中的哪个位置有Primary_kwd,请将其更改为Primary_kwd+'、'+Sec_kwd+'、'+Main_kwd。您可能随后必须过滤掉空结果。如果字符&'与单词一起使用,那么它是否有效@我们应该让他们工作。见,@Turophiles评论。我认为这是一个更好的方法。是的!!现在工作正常:谢谢你的帮助:@Turophile Too如果我想使用asc的订单,那么我把这行放在哪里@Wewesthemenace在最后,按项目ASC添加订单。
CREATE FUNCTION [dbo].[Split]
(
@RowData nvarchar(MAX),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data varchar(8000)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Select *
from #temp
cross apply fnSplit(Primary_Kwd,',')a
where a.value > ''
union all
Select b.value
from #temp
cross apply fnSplit(Sec_Kwd,',')b
where b.value > ''
union all
Select c.value
from #temp
cross apply fnSplit(Main_Kwd,',')c
where c.Value > ''