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 '') 部分是做什么的。然而,这可以解决问题。非常感谢。 @BettySTUFF(..1, 1, '')
部分只是删除了第一个分号,因此您得到的是“Name1;Name2”而不是“;Name1;Name2”。您可以只使用FullName + ';'
并完全删除STUFF
以获得类似“Name1;Name2;”的列表以上是关于SQL CONCAT IF 语句?的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to SQL语句之Concat/Union/Intersect/Except
带有 LEFT JOIN 和 IF 语句的有限 GROUP_CONCAT