Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何从一行的列值构建字符串?_Sql_Select_Sql Server 2008 R2_Case Statement - Fatal编程技术网

SQL:如何从一行的列值构建字符串?

SQL:如何从一行的列值构建字符串?,sql,select,sql-server-2008-r2,case-statement,Sql,Select,Sql Server 2008 R2,Case Statement,我有像这样的排 | NAME | RED | BLUE | GREEN | LeAnn 1 0 1 Jim 0 0 0 Timothy 1 1 1 我想写一个select语句,它将返回以下行 | Name | Note | LeAnn RED, Green Jim Timothy RED, BLU

我有像这样的排

|  NAME  |   RED  |  BLUE  |  GREEN  |
  LeAnn       1        0         1
  Jim         0        0         0
  Timothy     1        1         1
我想写一个select语句,它将返回以下行

| Name    | Note |
  LeAnn     RED, Green
  Jim       
  Timothy   RED, BLUE, GREEN
我该怎么做?我尝试使用case语句,但在Note中只得到一个值,而不是多个值。谢谢

我的尝试:

SELECT Name, 
       CASE
         WHEN Red = 1 THEN 'Red' + ', '
         WHEN Blue = 1 THEN 'Blue' + ', '
         WHEN Green = 1 THEN 'Green' + ', '
       END as Note
  FROM MyTable
我想这应该管用!如果没有,请告诉我;)

需要有3个单独的案例,否则它将只执行其中一个


您需要更新以上内容以正确处理逗号,但我懒得将其放入

,因为这些情况并不相互排斥,您需要三种不同的情况:

SELECT ('' + 
    CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END
+   CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END
+   CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
)
AS Note
FROM MyTable
这个怎么样

select name, left(Note, abs(len(Note) - 1)) from (
  select name, '' +
      CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END +
      CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END +
      CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
      as Note
  from t
) final
这将创建一个必须修剪的尾随逗号。例如:

SELECT
  REPLACE(
    ''
    + ISNULL(NULLIF(Red, 0), 'Red, ')
    + ISNULL(NULLIF(Blue, 0), 'Blue, ')
    + ISNULL(NULLIF(Green, 0), 'Green, ') 
    + '$',
    ', $',
    ''
  ) AS Note
FROM 
  TheTable

你能告诉我们你的尝试吗?既然您得到了一个值,我相信您已经非常接近了。T-SQL中没有这样的
IF
。这在SQL Server 2008中有效吗?我有语法错误。如果你有语法错误,我想不会。CONCAT不是SQLServer2008格式,我想IF语句也不是。我想你可能需要看看下面@Tomalak的帖子@pascalvgemert在SQL Server中提供
IF
语句。它做流量控制。虽然没有
IF
功能,但这是通过
CASE WHEN
解决的。对于这里的任何人来说,我都是通过在每个CASE语句行的末尾添加
+
来解决的(最后一行除外)。@Danny谢谢你的评论。谢谢你的回答,八年后它帮助了我!
select name, left(Note, abs(len(Note) - 1)) from (
  select name, '' +
      CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END +
      CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END +
      CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
      as Note
  from t
) final
SELECT
  ''
  + ISNULL(NULLIF(Red, 0), 'Red, ')
  + ISNULL(NULLIF(Blue, 0), 'Blue, ')
  + ISNULL(NULLIF(Green, 0), 'Green, ')
  AS Note
FROM 
  TheTable
SELECT
  REPLACE(
    ''
    + ISNULL(NULLIF(Red, 0), 'Red, ')
    + ISNULL(NULLIF(Blue, 0), 'Blue, ')
    + ISNULL(NULLIF(Green, 0), 'Green, ') 
    + '$',
    ', $',
    ''
  ) AS Note
FROM 
  TheTable