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