如果是SQL语句中的逻辑

时间:2010-09-06 15:11:26

标签: sql select

我想要做的应该是非常简单,但不知怎的,我无法找到正确的答案来解决我的问题。 我过去曾问过类似的问题,但之前给出的答案已经不再符合要求了。 所以这是正在发生的事情 - 我需要有条件地从数据库中的表中选择不同于通常方式的值,如下所示:

表:

  • Id int(非null)
  • ParentId int(非null)
  • EventOn DateTime(非null)
  • 用户int(null)

通过以下选择:

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的非空行。但是如果此条件没有非空行,则将显示空值。我希望我现在很清楚。

6 个答案:

答案 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