Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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中的Case语句_Sql_Case_Unpivot - Fatal编程技术网

非透视场景sql中的Case语句

非透视场景sql中的Case语句,sql,case,unpivot,Sql,Case,Unpivot,我正在尝试取消透视查询集,如下所示 Member ID N1code N2code N3code Name 1234 234 567 878 ted 23344 4242 23232 Mike 我想要一个case语句,它可以帮助在取消激活后显示类型 MemberID Codes Name Type 1234 234 ted N1 1234 567 ted

我正在尝试取消透视查询集,如下所示

Member ID   N1code  N2code  N3code  Name 
1234        234     567     878     ted 
23344       4242    23232           Mike 
我想要一个case语句,它可以帮助在取消激活后显示类型

MemberID Codes  Name    Type 
1234     234    ted     N1
1234     567    ted     N2
1234     878    ted     N3
23344    4242   Mike    N1
23344   23232   Mike    N2

在PostgreSQL中,您可以将列转换为数组,然后取消测试(分解):


在SQL Server中,它只是一个简单的
UNPIVOT
。不需要使用
CASE
语句,因为原始列名会在
UNPIVOT
中返回。我们只需从原始列名中提取左2个字符。如果希望它不是列名的派生项,则必须使用
大小写

查看最外层的select以查看这些选定列的来源

SELECT unpiv.MemberID, unpiv.Name, unpiv.theCode, left(codes,2) AS theType
FROM
(
  SELECT MemberID, Name, N1Code, N2Code, N3Code
  FROM t1
) AS src
UNPIVOT 
(
  theCode FOR codes IN (N1Code, N2Code, N3Code)
) AS unpiv;
对于MySQL 5.x及更低版本,您可以使用
交叉连接
和几个
CASE
语句

SELECT t1.MemberID, t1.Name
    , CASE cj.colName
        WHEN 'N1Code' then t1.N1Code
        WHEN 'N2Code' then t1.N2Code
        WHEN 'N3Code' then t1.N3Code
      END AS theCode
    , CASE cj.colName
        WHEN 'N1Code' then 'N1'
        WHEN 'N2Code' then 'N2'
        WHEN 'N3Code' then 'N3'
      END AS theType
FROM t1
CROSS JOIN
(
  SELECT 'N1Code' AS colName
  UNION ALL
  SELECT 'N2Code'
  UNION ALL
  SELECT 'N3Code'
) cj

SQL的风格和版本是什么?可能重复的
类型
来自
N(x)code
列名,只有前两个字符我将其编辑掉,因为它应该是对问题的注释,而不是答案谢谢!我用交叉应用函数解决了这个问题。
SELECT t1.MemberID, t1.Name
    , CASE cj.colName
        WHEN 'N1Code' then t1.N1Code
        WHEN 'N2Code' then t1.N2Code
        WHEN 'N3Code' then t1.N3Code
      END AS theCode
    , CASE cj.colName
        WHEN 'N1Code' then 'N1'
        WHEN 'N2Code' then 'N2'
        WHEN 'N3Code' then 'N3'
      END AS theType
FROM t1
CROSS JOIN
(
  SELECT 'N1Code' AS colName
  UNION ALL
  SELECT 'N2Code'
  UNION ALL
  SELECT 'N3Code'
) cj