SQL Server:多列连接的最佳方法是什么?

22

我正在尝试在SQL Server 11.00.3393中的查询中连接多个列。

我尝试了新函数CONCAT(),但当我使用超过两个列时它不起作用。

所以我想知道是否这是解决问题的最佳方式:

SELECT CONCAT(CONCAT(CONCAT(COLUMN1,COLUMN2),COLUMN3),COLUMN4) FROM myTable

由于存在NULL值,我无法使用COLUMN1 + COLUMN2

编辑

如果我尝试SELECT CONCAT('1','2','3') AS RESULT,我会收到错误提示:

CONCAT函数需要2个参数


2
CONCAT函数不仅限于两个参数(http://sqlfiddle.com/#!6/87f62/3),因此这不太可能是您的问题。您可以始终使用“SET CONCAT_NULL_YIELDS_NULL OFF”来避免与“NULL”相关的问题。 - GarethD
我猜测你的代码中有语法错误。你能把剩下的代码发出来吗? - SQLChao
@Goat CO 我没有使用规范的 CONCAT()。也许这是在 VisualStudio2010 的配置问题? - D. Caan
这就是为什么我仍然使用SSMS并避免在Visual Studio中编写查询的原因 :) - TMNT2014
1
CONCAT() 函数是在 SQL 2012 中引入的,因此 VS 2010 将其转换为它所知道的内容是有道理的。 - Hart CO
显示剩余8条评论
7个回答

25

通过交流可以清楚地看出,问题在于使用VS2010编写查询,因为它使用的是只能接受两个参数的规范CONCAT()函数。可能有一种方法可以更改它,但我不知道。

另一种选择:

SELECT '1'+'2'+'3'

该方法需要将非字符串类型的值转换为字符串,并通过 ISNULL()COALESCE() 处理 NULL 值:

SELECT  ISNULL(CAST(Col1 AS VARCHAR(50)),'')
      + COALESCE(CONVERT(VARCHAR(50),Col2),'')

3
SELECT CONCAT(LOWER(LAST_NAME), UPPER(LAST_NAME)
       INITCAP(LAST_NAME), HIRE DATE AS ‘up_low_init_hdate’)
FROM EMPLOYEES
WHERE HIRE DATE = 1995

1
尝试使用以下内容:
SELECT 
    (RTRIM(LTRIM(col_1))) + (RTRIM(LTRIM(col_2))) AS Col_newname,
    col_1,
    col_2 
FROM 
    s_cols 
WHERE
    col_any_condition = ''
;

0

0

引用

Oracle SQL中使用连接非常容易和有趣。但是不太了解MS-SQL。

引用

下面我们来看看Oracle:

语法: SQL> select First_name||Last_Name as Employee from employees;

结果:员工

EllenAbel SundarAnde MozheAtkinson

这里AS:关键字用作别名。 我们可以与NULL值连接。 例如:columnm1 || Null

假设您的任何一列包含NULL值,则结果将仅显示具有值的该列的值。

您还可以在连接中使用文字字符串

例如: select column1 ||' is a '||column2 from tableName; 结果:column1是column2。 在文字之间应使用单引号括起来。您可以排除数字。

注意:这仅适用于oracle服务器// SQL。


0

对于任何与Snowflake打交道的人

可以尝试像这样使用CONCAT处理多列:

SELECT
    CONCAT(col1, col2, col3) AS all_string_columns_together
    , CONCAT(CAST(col4 AS VARCHAR(50), col1) AS string_and_int_column
FROM table

-3

如果字段可为空,那么你必须处理这些null值。请记住,null是具有传染性的,concat('foo', null)只会得到NULL

SELECT CONCAT(ISNULL(column1, ''),ISNULL(column2,'')) etc...

基本上测试每个字段是否为空,如果是,则替换为空字符串。


5
CONCAT 函数 中,空值会被隐式转换为空字符串,这并不是必要的。 - GarethD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接