Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql server中选择3列数据作为单列_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何在sql server中选择3列数据作为单列

如何在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

我在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   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>'),'&','&amp;')
         + '</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 > ''