简体   繁体   English

为 SQL case 表达式中的“Then”子句返回多个值

[英]Return multiple values for 'Then' clause in an SQL case expression

My "files" table data is我的“文件”表数据是

fileid   file1      file2
  1      abc.pdf    abcde.pdf
  2      ghf.pdf    ghfjkl.pdf
  3      hjy.pdf    hjyui.pdf

my "sampletable" data is我的“样本表”数据是

 fileid       names
   1           abc
   2           ghf
   3           hjy
   4           juk

I need output like我需要像这样的输出

   fileid      names    files

     1          abc      abc.pdf
     1          abc      abcde.pdf
     2          ghf      ghf.pdf
     2          ghf      ghfjkl.pdf
     3          hjy      hjy.pdf
     3          hjy      hjyui.pdf

i tried the following query but not getting desired output我尝试了以下查询,但没有得到所需的输出

 select st.fileid,st.contolnames,
 case when st.fileid in (select fileid from Files) 
 then f.file1 
 when st.fileid in (select fileid from Files)  then f.file2 end as Files
 from sampletable st
 join Files f on f.fileid=st.fileid 

Please help with this demo: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=08337e2ee351b573bc902f06fcfba272请帮助这个演示: https : //dbfiddle.uk/?rdbms=mysql_8.0&fiddle=08337e2ee351b573bc902f06fcfba272

You can try below - use UNION您可以尝试以下 - 使用UNION

DEMO 演示

    select * from
    (
    select a.fileid,contolnames,file1 as files
    from Files a inner join sampletable b on a.fileid=b.fileid
    union
    select a.fileid,contolnames,file2 as files 
    from Files a inner join sampletable b on  a.fileid=b.fileid
  )A order by fileid

OUTPUT:输出:

fileid  contolnames files
1         abc   abc.pdf
1         abc   abcdef.pdf
2         ghf   ghf.pdf
2         ghf   ghfjkl.pdf
3         hjy   hjyui.pdf
3         hjy   hjy.pdf

To generate two rows for each record you can use CROSS JOIN like following query to get the desired output.要为每条记录生成两行,您可以像以下查询一样使用CROSS JOIN来获得所需的输出。

select f.fileid, 
       st.contolnames as names, 
       case 
         when t.x = 1 then f.file1 
         else file2 
       end            as files 
from   Files f 
       inner join sampletable st 
               on st.fileid = f.fileid 
       cross join (select 1 x 
                   union 
                   select 2 x) t(x) 
order  by fileid 

Online Demo 在线演示

Try this one.试试这个。 it's working for me..它对我有用..

CREATE TABLE #Temp1(fileid INT IDENTITY, file1 varchar(50), file2 varchar(50))
CREATE TABLE #Temp2(fileid INT IDENTITY, name varchar(50))
CREATE TABLE  #Temp3(fieldid int, name varchar(50), file1 varchar(50) , file2 varchar(50))
create table #Temp4 (fieldid int, name varchar(50), files varchar(50))  

INSERT INTO #Temp1 VALUES( 'abc.pdf','abcde.pdf')
INSERT INTO #Temp1 VALUES( 'ghf.pdf','ghfjkl.pdf')
INSERT INTO #Temp1 VALUES( 'hjy.pdf','hjyui.pdf')


INSERT INTO #Temp2 VALUES( 'abc')
INSERT INTO #Temp2 VALUES( 'ghf')
INSERT INTO #Temp2 VALUES( 'hjy')
INSERT INTO #Temp2 VALUES( 'juk')

SELECT * FROM #Temp1
SELECT * FROM #Temp2


INSERT INTO #Temp3
SELECT * FROM (SELECT B.fileid ,name , 
CASE WHEN Name Like SUBSTRING(A.file1,1,3) THEN file1  END AS files, 
CASE WHEN Name Like SUBSTRING(A.file2,1,3) THEN  file2 END AS files1   
FROM #Temp1 A , #Temp2 B ) AA WHERE files IS NOT NULL

INSERT INTO #Temp4 SELECT fieldid,name,file1 FROM  #Temp3 

INSERT INTO #Temp4 SELECT fieldid,name,file2 FROM  #Temp3 

SELECT * FROM #Temp4 ORDER BY name asc

DROP TABLE #Temp1
DROP TABLE #Temp2
DROP TABLE #Temp3
DROP TABLE #Temp4

Just make a join with the UNPIVOT of the first Table.只需与第一个表的 UNPIVOT 连接即可。

select f.fileid, name, files 
from Files f 
unpivot (files for name in (file1,file2)) 
join sampletable s on f.fileid = s.fileid

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM