我想要做的应该是非常简单,但不知怎的,我无法找到正确的答案来解决我的问题。 我过去曾问过类似的问题,但之前给出的答案已经不再符合要求了。 所以这是正在发生的事情 - 我需要有条件地从数据库中的表中选择不同于通常方式的值,如下所示:
表:
通过以下选择:
SELECT RST.* FROM RangeSheetTime RST
WHERE RST.[User] is not null
(在上面的例子中,我获取了用户不为空的所有行)
Select RST.* FROM RangeSheetTime RST
WHERE RST.[User] is null
(在上面的例子中,我获取用户为null的所有行)
那我该怎么办?我想构建一个select语句,当给定条件时,例如EventOn< GETDATE()将检索USER不为null的所有行。如果没有USER不为null的行,那么它应该检索它为null的行(如果有的话)。
我该如何使用它?
注意:如果在这里我不能使用,否则这会更容易。
编辑:
我会尽力解释它。想象一下,我有3行同一个ParentId,31。 其中2行有一个名为StartOrEnd的列设置为1.它们之间只有区别, 对于第一个,USER列为空;对于第二个,USER列的值为90。 第3行将StartOrEnd列设置为0。 现在,无论startorend的值如何,我都希望显示结果。但是有一个问题。 对于每个startorend,如果有超过1行,其中一行将USER设置为null而其他的不为null, 那么只显示该startorend的非空行。但是如果此条件没有非空行,则将显示空值。我希望我现在很清楚。
答案 0 :(得分:4)
您应该查看CASE...WHEN
构造,它等同于SQL中的IF...THEN
:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5078041.html
答案 1 :(得分:3)
这可能有效:
SELECT RST.* FROM RangeSheetTime RST
WHERE RST.[User] IS NOT NULL
UNION ALL
SELECT RST.* FROM RangeSheetTime RST
WHERE RST.[User] IS NULL
AND NOT EXISTS (
SELECT Id FROM RangeSheetTime
WHERE [User] IS NOT NULL
)
目前我无法对此进行测试,因此无法保证。
答案 2 :(得分:0)
如果使用sqlserver,请查看case语句,它可能会执行您想要的操作。 选择a,b, 如果c不为null,则为'not null condition' 否则'无效条件 结束[C] 从 表T. 哪里 条件
如果使用oracle,我认为你可以使用解码。
干杯。
答案 3 :(得分:0)
Hallaghan,您是在询问检索标准还是操纵/显示SQL结果,如果您询问操作或显示结果案例会帮助您,Union对我来说看起来不错。
答案 4 :(得分:0)
id,parentid User,StartOrEnd
1,31,null,1
2,31,90,1
3,31,null,0
并且你想现在说,如果startorEnd对于一个父id有多个值,你只想看到用户不为null的行,否则带有null user的行将会出现。
如果是这样的话,Jeff给出的答案应该有效
答案 5 :(得分:0)
这个问题的最终解决方案并非易事,但是在将我们的头撞在墙上之后,我和一个队友将其弄平了。虽然这个主题的每个帖子都对我们有所帮助,但没有人能真正获得我们想要的价值,总会有瑕疵,但我们非常感谢所提供的所有帮助,没有它我们现在几乎没有达到答案。
所以解决方案如下:
select
P.ParentId RangeSheet
,coalesce(max(P.[End]), max(P.Start)) EventOn
,case when isnull(max(P.[End]), 0) = 0 then 1 else 0 end StartOrEnd
from
(
select
RST.ParentId
,case RST.StartOrEnd when 1 then RST.EventOn else null end Start
,case RST.StartOrEnd when 0 then RST.EventOn else null end [End]
from
(
select
coalesce(MAN.ParentId, AUT.ParentId) ParentId
,coalesce(MAN.StartOrEnd, AUT.StartOrEnd) StartOrEnd
,coalesce(max(MAN.CreatedOn), max(AUT.CreatedOn)) CreatedOn
from
(
-- Obter os manuais
select
RST.ParentId
,RST.StartOrEnd
,MAX(RST.CreatedOn) CreatedOn
from RangeSheetTime RST
where RST.[User] is not null
group by RST.ParentId, RST.StartOrEnd
) MAN
full outer join
(
-- Obter os automáticos
select
RST.ParentId
,RST.StartOrEnd
,MAX(RST.CreatedOn) CreatedOn
from RangeSheetTime RST
where RST.[User] is null
group by RST.ParentId, RST.StartOrEnd
) AUT on MAN.ParentId=AUT.ParentId and MAN.StartOrEnd=AUT.StartOrEnd
group by coalesce(MAN.ParentId, AUT.ParentId), coalesce(MAN.StartOrEnd, AUT.StartOrEnd)
) FOJ
inner join RangeSheetTime RST on FOJ.ParentId=RST.ParentId and FOJ.StartOrEnd=RST.StartOrEnd and FOJ.CreatedOn=RST.CreatedOn
) P
group by P.ParentId