SQL CONCAT IF 语句?

Posted

技术标签:

【中文标题】SQL CONCAT IF 语句?【英文标题】:SQL CONCAT IF Statement? 【发布时间】:2012-03-12 11:24:48 【问题描述】:

大家早安,

我不确定我需要如何解决我的以下查询...我有以下查询可以拉回 SQL 服务器中所需的记录...

SELECT agenda.AgendaItemNumber,Agenda.AgendaName, AgendaType.AgendaTypeDescription, userdetails.fullName 
FROM Agenda
JOIN AgendaType ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID
JOIN UserDetails ON Agenda.AgendaID = Userdetails.AgendaID
WHERE agenda.AgendaTypeID = '2'
AND AgendaItemNumber = AgendaItemNumber
AND AgendaName = AgendaName
AND AgendaTypeDescription = AgendaTypeDescription
AND AgendaItemNumber >= '3'

上述查询有效,但我需要稍微增强一下。它拉回以下结果,除了“全名”列之外,它们基本上是重复的记录...

我想要做的是能够向这个查询添加一些额外的代码,这样当我运行查询时,我能够为每个“AgendaItemNumber”显示一条记录,并为此连接两个全名记录。但是,我在此表中有其他 AgendaItemsNumbers,仅分配了 1 个用户全名。我需要巧妙地处理图像文件中的这几条记录。

也许有更好的方法来完成这项任务?

提前非常感谢。如有任何疑问,请不要犹豫。

问候 贝蒂

【问题讨论】:

“AND AgendaItemNumber = AgendaItemNumber...”。嗯,为什么? AND AgendaItemNumber = AgendaItemNumber AND AgendaName = AgendaName AND AgendaTypeDescription = AgendaTypeDescription 没有意义。也使用 INNER JOIN 【参考方案1】:
SELECT  agenda.AgendaItemNumber,
        Agenda.AgendaName, 
        AgendaType.AgendaTypeDescription, 
        STUFF(( SELECT  ';' + FullName 
                FROM    UserDetails
                WHERE   UserDetails.AgendaID = Agenda.AgendaID
                FOR XML PATH('')
            ), 1, 1, '') AS fullName 
FROM    Agenda
        INNER JOIN AgendaType 
            ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID
        INNER JOIN UserDetails 
            ON Agenda.AgendaID = Userdetails.AgendaID
WHERE   agenda.AgendaTypeID = '2'
AND     AgendaItemNumber = AgendaItemNumber
AND     AgendaName = AgendaName
AND     AgendaTypeDescription = AgendaTypeDescription
AND     AgendaItemNumber >= '3'

附录

SQL-Server 中的 XML 扩展允许您将多行连接成一行。扩展的实际目的是让您可以输出为 XML(显然),但有一些漂亮的技巧是扩展的副产品。在上述查询中,如果子查询 (FullName) 中有列名,它将输出为<FullName>Joe Bloggs1</FullName><FullName>Joe Bloggs2</FullName>,因为没有列名,它只是连接行(不形成正确的 XML)。 PATH 部分允许您指定一个额外的节点,例如,如果您在上面使用 PATH('Name'),您将获得 <Name>;Joe Bloggs</Name><Name>;Joe Bloggs2</Name> 如果您将 Path 与列名结合,您将获得 Joe Bloggs。

最后STUFF 只是删除了列表开头的分号。

【讨论】:

@GarethD 非常感谢上述查询。这似乎是一种享受。我可以问一下 XML Path 的作用吗?本质上是 FullName 列查询的 CONCAT 部分。不太确定查询的 .... ,1,1 '') 部分是做什么的。然而,这可以解决问题。非常感谢。 @Betty STUFF(..1, 1, '') 部分只是删除了第一个分号,因此您得到的是“Name1;Name2”而不是“;Name1;Name2”。您可以只使用FullName + ';' 并完全删除STUFF 以获得类似“Name1;Name2;”的列表

以上是关于SQL CONCAT IF 语句?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL语句之Concat/Union/Intersect/Except

使用sql concat拼接更新语句

带有 LEFT JOIN 和 IF 语句的有限 GROUP_CONCAT

SQL 在 concat 语句之间打印一个空格

LINQ to SQL语句Concat/Union/Intersect/Except--2017年2月22日

如何在同一 SQL 语句中使用 SELECT DISTINCT 和 CONCAT