如何在PostgreSQL中使用case获取多个记录?

时间:2012-01-04 09:02:16

标签: sql postgresql

我有两张桌子:

 1) fk_tblUserEmployeeList
 2) fk_tblmanageremployeelist

在这两个表中,一列是常见的userid,我从UI获得userid。我想从第一张表中获得userid的记录。如果没有,请从第二个表中获取相同userid的记录..

我正在尝试使用CASE,但收到错误:

ERROR:  more than one row returned by a subquery used as an expression

以下是我的询问:

select case when ( select count(userid) 
                   from fk_tblUserEmployeeList 
                   where userid=1
                 ) > 1 
            then ( select employeeid 
                   from fk_tblUserEmployeeList 
                   where userid=1
                 )
            else ( select employeeid 
                   from fk_tblmanageremployeelist 
                   where userid=1
                 ) 
       end

4 个答案:

答案 0 :(得分:1)

使用您提供的代码,case的结果将包含多个row。由于先前select case,因此会出错。你不能select多个rows

select

case when (select count(userid) from fk_tblUserEmployeeList where userid=1) > 1
    then (select employeeid from fk_tblUserEmployeeList where userid=1)
    else (select employeeid from fk_tblmanageremployeelist where userid=1)
end

因此,为避免这种情况,您可以使用IF

它应该是这样的:

IF (select count(userid) from fk_tblUserEmployeeList where userid=1) > 1 THEN
    (select employeeid from fk_tblUserEmployeeList where userid=1)
ELSE
    (select employeeid from fk_tblmanageremployeelist where userid=1)
END IF;

答案 1 :(得分:1)

尝试:

select employeeid 
from fk_tblUserEmployeeList 
where userid=1
union all
select employeeid 
from fk_tblmanageremployeelist
where userid=1 and
not exists (select null
            from fk_tblUserEmployeeList 
            where userid=1)

请注意,如果两个表中都没有用户,则不需要not exists子句。

答案 2 :(得分:0)

    select employeeid 
    from fk_tblUserEmployeeList 
    where userid = 1
      and ( select count(*) 
            from fk_tblUserEmployeeList 
            where userid=1
          ) > 1
  union all
    select employeeid 
    from fk_tblmanageremployeelist 
    where userid = 1
      and ( select count(*) 
            from fk_tblUserEmployeeList 
            where userid = 1
          ) <= 1

答案 3 :(得分:0)

我想这将是最简单和最快的:

SELECT COALESCE(
        (SELECT employeeid FROM fk_tblUserEmployeeList    WHERE userid = 1),
        (SELECT employeeid FROM fk_tblmanageremployeelist WHERE userid = 1))

如果userid不是 UNIQUE ,则必须添加一个方法来选择一行,例如:

SELECT COALESCE(
        (SELECT employeeid
         FROM   fk_tblUserEmployeeList
         WHERE  userid = 1
         ORDER  BY employeeid
         LIMIT  1),
        (SELECT employeeid
         FROM   fk_tblmanageremployeelist
         WHERE  userid = 1
         ORDER  BY employeeid
         LIMIT  1)
        )