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 个参数。

有什么问题,所以我可以解决它,因为 concatconcatenate 超过 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版本不兼容解决方案

我如何编写 SQL concat 函数?

Mysql group_concat函数列转行,与行转列

oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )

hive函数之~行转列与列转行

Pandas 中的 Concat 2 列 - AttributeError:“DataFrame”对象没有属性“concat”