CONCAT 函数中超过 2 列
Posted
技术标签:
【中文标题】CONCAT 函数中超过 2 列【英文标题】:More than 2 columns in a CONCAT function 【发布时间】:2013-05-10 03:32:05 【问题描述】:在 SQL Server 2012 中,我想将 concat
5 列合并为 1,但在查询中它可以工作,但是当我放入视图时,它会给我一个类似
消息 174,第 15 级,状态 1,第 3 行 CONCAT 函数需要 2 个参数。
有什么问题,所以我可以解决它,因为 concat
是 concatenate
超过 1 列的一个很好的函数,因为如果它为空,它们会使其为空..
代码:
SELECT
'Aan ' + A.Name AS 'Naam',
fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) AS 'T.a.v.',
ISNULL(ISNULL(A.Address1_Line2, A.Address1_Line1),
C.Address1_Line2) AS 'Adres',
ISNULL(A.Address1_PostalCode + ' ' + A.Address1_City, A.Address2_PostalCode + ' ' + A.Address2_City) AS 'Woonplaats',
'heer' + ' ' + ISNULL(C.MiddleName + ' ', N'') + ISNULL(C.LastName, N'') AS 'Aanhef'
FROM
dbo.Account AS A
FULL OUTER JOIN
dbo.Contact AS C ON A.Name = C.AccountIdName
WHERE
(C.Salutation = 'Dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1)
AND (ISNULL(C.StatusCode, 1) = 1) OR (C.Salutation = 'dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) AND (ISNULL(C.StatusCode, 1) = 1)
【问题讨论】:
你能贴出你正在使用的代码吗? 如果没有其他解决办法可以尝试IsNull(columnName1, '') + IsNull(columnName2, '')...
。
这是我之前尝试过的,但你必须看这里raresql.com/tag/concat-function这更快
相关问题github.com/MicrosoftDocs/sql-docs/issues/4805
【参考方案1】:
喂。如果您想将 CONCAT 作为规范函数 fn CONCAT(...) 使用到视图设计器中,则可以使用一种变通解决方案来连接两个以上的列/字符。
您可以像这样在 CONCAT 中使用 CONCAT:
假设您想将两个代码连接成一个代码,其中一个“-”
第 1 列 = 123456
column2 = 0001
fn CONCAT(fn CONCAT(column1, '-'), column2)
因此您将拥有:123456-0001
【讨论】:
@kenneth-m-nielsen 的解决方案对我有用,直到我不得不对某些列使用 CAST(x)。在那个演员阵容中,这是唯一对我有用的解决方案。【参考方案2】:您的视图中的其他地方一定有错误!
好的,那么我对你的代码所做的就是改变这一行
fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) AS 'T.a.v.'
到这里
CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) AS 'T.a.v.'
编辑:
只是为了解释代码中的差异,带有 fn .... 的那个是一个规范函数,微软承诺它将适用于所有 ODBC 连接。
来自 MSDN:
规范函数是所有数据提供者都支持的函数,并且可以被所有查询技术使用。提供者不能扩展规范函数。
【讨论】:
不存在,因为我使用了相同的查询,但随后使用了 INSNULL(expresion1,'') 等,这是有效的.. 换句话说 fn CONCAT(...) 是只接受 2 个参数的 'ODBC' 函数,而普通的 CONCAT(...) 是接受许多参数的 SQL Server 2012 函数。 你现在真的是我的问题吗??问题是当我将正确的代码放入视图时,视图将代码从 CONCAT 更改为 fn CONCAT( 好的,从描述中很难知道。您是在 SSMS 中编写视图还是使用某种工具,因为当我编写视图时,这不会发生在我身上! @Jeroen 视图之所以这样做,是因为您使用的是非常糟糕和错误的视图设计器。如果您在普通查询窗口中编辑视图代码,则不会发生这种情况。因此,不要右键单击 > 修改/设计,而是选择右键单击 > 脚本作为更改为 > 新查询窗口。【参考方案3】:我遇到了同样的问题,所有其他答案都对我不起作用,我不想使用 Andrei 的答案。
我设法使用 create view 语句创建了视图。
CREATE VIEW ViewName AS
SELECT
'Aan ' + A.Name AS 'Naam',
fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) AS 'T.a.v.',
ISNULL(ISNULL(A.Address1_Line2, A.Address1_Line1),
C.Address1_Line2) AS 'Adres',
ISNULL(A.Address1_PostalCode + ' ' + A.Address1_City, A.Address2_PostalCode + ' ' + A.Address2_City) AS 'Woonplaats',
'heer' + ' ' + ISNULL(C.MiddleName + ' ', N'') + ISNULL(C.LastName, N'') AS 'Aanhef'
FROM dbo.Account AS A
FULL OUTER JOIN
dbo.Contact AS C ON A.Name = C.AccountIdName
WHERE
(C.Salutation = 'Dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1)
AND (ISNULL(C.StatusCode, 1) = 1) OR (C.Salutation = 'dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) AND (ISNULL(C.StatusCode, 1) = 1)
【讨论】:
最后一个帮助了我,谢谢。 SQL 不断将我在新视图设计器中的嵌套 CONCAT 更改为 fn CONCAT ....。在设计师更改之前,我只是使用了我的工作 SQL 代码。谢谢!!【参考方案4】:我遇到了同样的错误。以下是它是如何发生的。我在 SQL Server (2014) Management Studio 中使用了查询/视图生成器。我输入了函数“CONCAT (...”,但它把它转换为“fn CONCAT(...)”。然后我得到了错误,尽管有多个项目。
我去掉了“fn ... ”,它工作得很好。
【讨论】:
这应该是公认的答案。【参考方案5】:使用CONCAT_WS
代替CONCAT
。
即使您在 SSMS 的设计模式下使用它,它也会在视图中保持不变,并且您可以使用它指定一个不会附加在字符串末尾的字符串分隔符。
例子:
select CONCAT_WS('; ',NULL,'Frank',NULL,'Mary')
结果将是Frank; Mary
【讨论】:
【参考方案6】:在视图 SQL Server 中创建 CONCAT FUNCTION必须需要 2 个参数。所以你可以试试这个:
SELECT
concat(
concat('T.a.v. ', C.Salutation + ' '),
concat(C.FirstName + ' ', concat(C.MiddleName + ' ', C.LastName))
) AS 'T.a.v.'
【讨论】:
【参考方案7】:对我来说效果很好! 从 myview 中选择 (column1 + column2 + column3) 作为 myconcat 而是 fn CONCAT(fn CONCAT(column1, '-'), column2)
【讨论】:
【参考方案8】:当我想使用设计器创建视图并且 ssms 设计器自动添加 fn exp .... 时遇到了这个问题,但我改为使用脚本, Cerate View ViewName 我的连接脚本
这没有问题
【讨论】:
以上是关于CONCAT 函数中超过 2 列的主要内容,如果未能解决你的问题,请参考以下文章
Oracle列转行函数vm_concat在19C版本不兼容解决方案
oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )
Pandas 中的 Concat 2 列 - AttributeError:“DataFrame”对象没有属性“concat”