SQL条件选择,可能为空

SQL条件选择,可能为空,sql,sql-server-2008,Sql,Sql Server 2008,我尝试在stackoverflow上搜索这个,但找不到答案 我正在简化我的问题,以便它更容易阅读,如果必要的话,我会扩展 我有一个员工SQL表,其中包含姓名、地址、雇用日期,我们最近添加了一个重新雇用日期,以跟踪新员工何时重新加入公司。我想写一个SQL搜索来提取姓名、地址和他们最近的雇佣日期。如果是重新聘用,我会使用重新聘用日期字段,但如果是原始聘用,则使用雇用日期字段。我猜这是一个案例语句,它在重新激发日期字段中寻找一个空,但超出该字段我就丢失了。这应该会产生您想要的结果: SELECT Na

我尝试在stackoverflow上搜索这个,但找不到答案

我正在简化我的问题,以便它更容易阅读,如果必要的话,我会扩展


我有一个员工SQL表,其中包含
姓名、地址、雇用日期
,我们最近添加了一个
重新雇用日期
,以跟踪新员工何时重新加入公司。我想写一个SQL搜索来提取
姓名、地址和他们最近的雇佣日期。如果是重新聘用,我会使用
重新聘用日期
字段,但如果是原始聘用,则使用
雇用日期
字段。我猜这是一个
案例
语句,它在
重新激发日期
字段中寻找一个
,但超出该字段我就丢失了。

这应该会产生您想要的结果:

SELECT Name
    , Address
    , CASE WHEN REHIRE_DATE IS NULL THEN HIRE_DATE ELSE REHIRE_DATE END
FROM Employee

这将检查重新雇用日期是否为空,如果为
NULL
,则您将获得雇用日期,如果不是,则您将返回重新雇用日期

这将产生您想要的结果:

SELECT Name
    , Address
    , CASE WHEN REHIRE_DATE IS NULL THEN HIRE_DATE ELSE REHIRE_DATE END
FROM Employee
这将检查重新雇用日期是否为空,如果为
NULL
,则您将获得雇用日期,如果不是,则您将返回重新雇用日期

使用IFNULL()更好:

更好的方法是使用IFNULL():


我认为你需要做的就是:

SELECT
    NAME
    , ADDRESS
    , ISNULL(REHIRE_DATE, HIRE_DATE) AS MostRecentHireDate
FROM Employee

在这种情况下,如果重新雇用日期已填写,则重新雇用日期应始终大于雇用日期(在被雇用之前,您无法获得重新雇用。因此,您只需始终选择重新雇用日期,除非它为空,此时您选择雇用日期。听起来不错?

我认为您需要做的是:

SELECT
    NAME
    , ADDRESS
    , ISNULL(REHIRE_DATE, HIRE_DATE) AS MostRecentHireDate
FROM Employee

在这种情况下,如果重新雇用日期已填写,则重新雇用日期应始终大于雇用日期(您无法在被雇用之前获得重新雇用。因此,您始终希望获得重新雇用日期,除非该日期为空,此时您将获得雇用日期。听起来不错?

您也可以使用coalesce()函数以这种方式执行此操作

select name, address, coalesce(rehire_date,hire_date) from table_name

如果第一个值为null,它将转到第二个值,您也可以使用coalesce()函数,这样做

select name, address, coalesce(rehire_date,hire_date) from table_name


如果第一个值为NULL,它将转到第二个值

,也许你可以添加一个小样本数据集和你期望的输出,这与你的问题无关,但是你可能想考虑把租用日期存储在一个单独的表中,例如<代码>雇佣期(雇员ID(FK),开始日期,结束日期)。
。使用当前配置,如果员工第三次重新启动,则无处存储重新雇用日期,而不会丢失上次重新雇用日期。如果使用一对多表关系,他们可以随意离开和返回多次,而不会造成数据库问题。也许您可以添加一个小样本数据集和ou你是否期望?这与你的问题无关,但你可能想考虑把租用日期存储在一个单独的表中,例如<代码>雇佣期(雇员ID(FK),开始日期,结束日期)。。使用当前配置,如果员工第三次重新启动,则无处存储重新雇用日期,而不会丢失上次重新雇用日期。如果使用一对多表关系,他们可以随意离开和返回,而不会导致数据库问题。这太完美了。我挂断了使用“=NULL”和“非空”的连接是的,你不能使用
=NULL
你必须使用
IS NULL
:)使用
ISNULL
函数不是更清楚一点吗?
ISNULL(重新招聘日期,招聘日期)
正是你在这里所做的。@JeremyPrideMoore你可以用其中任何一个,我只是用了
CASE
作为我的答案。那太完美了。我挂断了使用'=NULL'和非'is NULL'。是的,你不能使用
=NULL
你必须使用
is NULL
:)使用
ISNULL
函数不是更清楚一点吗
ISNULL(重新招聘日期、招聘日期)
正是您在这里所做的。@JeremyPridemore您可以使用其中任何一种,我刚才使用了
CASE
作为我的答案。
IFNULL
不是有效的SQL Server语法<代码>合并或
ISNULL
都可以工作。有一个很好的答案解释了两者之间的区别。对不起,我没有注意到标签,问题也没有具体说明。IFNULL()是我在MySQL中每天使用的语法。
IFNULL
不是有效的SQL Server语法<代码>合并或
ISNULL
都可以工作。有一个很好的答案解释了两者之间的区别。对不起,我没有注意到标签,问题也没有具体说明。IFNULL()是我在MySQL中每天使用的。如果两个值都不为null,则返回两个值。我知道这很旧,但对于其他通过谷歌搜索得到的结果:如果两个值都不为null,则不会返回两个值,您仍然只会得到第一个非null结果。这就是SQL Server中的工作方式。如果两个值都不为null,则返回两个值。我知道这很旧,但对于其他通过谷歌搜索得到的结果:如果两个值都不为null,则不会返回两个值,您仍然只会得到第一个非null结果。这就是SQL Server中的工作方式。