SQL返回空值

时间:2014-05-26 04:46:55

标签: mysql sql sql-server

只是运行SQL并使用子查询编写了一个查询,但是当它没有假设时它返回了一个空值。不确定是否有人可以在没有数据库的情况下提供帮助,但这是我的查询:

*这是运动问题: '使用带有子查询的SQL语句列出员工ID及其全名 作为经理的员工。使用列标题Manager ID和Manager。'

SELECT 
    ReportsTo As 'Manager ID',
    CONCAT(FirstName,' ',Lastname) As 'Manager'

FROM 
    Employees
WHERE 
    EmployeeID IN 
        (SELECT  ReportsTo 
            FROM Employees);

3 个答案:

答案 0 :(得分:0)

假设我理解您的问题,您希望返回标记为经理的员工(由reportto列表示)。如果是这样,您可以使用EXISTS

select employeeid, concat(firstname,' ', lastname) fullname
from employees e
where exists (
  select 1
  from employees e2
  where e.employeeid = e2.reportsto)

这将返回一个员工列表,其员工的ID和全名在reportsto字段中存在。

如果您更喜欢in语法,那么这应该是相同的:

select employeeid, concat(firstname,' ', lastname) fullname
from employees e
where employeeid in (
  select reportsto
  from employees
)

答案 1 :(得分:0)

首先,子查询显示不正确。您试图说“从Employees表中获取ReportsTo和人员名称,其中Employee ID等于同一表中的任何ReportsTo字段

您需要将子查询中的ReportsTo更改为EmployeeID。 IE

SELECT 
    ReportsTo As 'Manager ID',
    CONCAT(FirstName,' ',Lastname) As 'Manager'

FROM 
    Employees
WHERE 
    EmployeeID IN 
    (SELECT  EmployeeID --Here is where i've changed the value 
        FROM Employees);

然而,这个查询本身与简单的写作没有区别:

SELECT 
    ReportsTo As 'Manager ID',
    CONCAT(FirstName,' ',Lastname) As 'Manager'

FROM 
    Employees

如果您试图以某种方式过滤掉您的结果,您想要过滤掉哪些“员工”记录?请提供更多信息。

答案 2 :(得分:0)

用户 CONCATWS 功能代替处理空值的 CONCAT

参考链接 MySQL CONCAT returns NULL if any field contain NULL

下面是sqlserver示例。在sqlserver ISNULL 函数中处理空值

declare @Employees table(EmployeeID int, firstname varchar(50), lastname varchar(50), ReportsTo int null)

insert into @Employees values ( 1,'abc','xyz',0),( 2,'def','xyz1',1),( 3,'abc1','xyz2',null)

SELECT 
    ReportsTo As 'Manager ID',
    isnull( FirstName ,'') + '' + ISNULL(lastname,0 ) as 'Manager'
    --CONCAT(FirstName,' ',Lastname) As 'Manager'

FROM 
    @Employees
WHERE 
    EmployeeID IN 
        (SELECT  ReportsTo 
            FROM @Employees);