2010-09-06 3 views
3

То, что я пытаюсь сделать, должно быть очень простым, но почему-то я не могу найти правильный ответ на мою проблему. Я просил что-то подобное в прошлом, но ответ, который мне дал раньше, больше не соответствует требованиям. Так вот что происходит - мне нужно условно выбрать значения из таблицы в моей базе данных в другой, чем обычным способом, например, так:Если логика в SQL-заявлении

Таблица:

  • Id Int (не равно нулю)
  • ParentId INT (не нуль)
  • EventOn DateTime (не нуль)
  • ИНТ пользователя (нуль)

К следующим выберите:

SELECT RST.* FROM RangeSheetTime RST 
WHERE RST.[User] is not null 

(в приведенном выше случае, я беру все строки, в которых пользователь не равно нулю)

Select RST.* FROM RangeSheetTime RST 
WHERE RST.[User] is null 

(в приведенном выше случае, я беру все строки, где пользователь равен нулю)

Так что же я пытаюсь сделать? Я хочу построить оператор select, который при задании условия, например EventOn < GETDATE(), будет извлекать все строки, в которых USER не равен NULL. Если нет каких-либо строк, в которых USER не является нулевым, то он должен извлекать строки, где он равен NULL, если таковой имеется.

Как я могу заставить это работать?

Примечание: Я не могу использовать, если здесь, иначе это было бы проще.

EDIT:

Я буду пытаться объяснить это лучшее, что я могу. Представьте, что у меня есть 3 строки для одного и того же ParentId, 31. 2 из этих строк имеют столбец с именем StartOrEnd, установленным в 1. Существует только разница между ними: для первого, столбец USER - null; для второго, столбец USER имеет значение 90. Третья строка имеет столбец StartOrEnd, установленный в 0. Теперь я хочу отображать результаты независимо от значения startorend. Но есть улов. Для каждого startorend, если есть более одной строки, и один из них имеет USER, установленный в null, а остальные не равны null, , тогда будут отображаться только ненулевые строки для этого startorend. но в случае, если для этого условия нет ненулевых строк, будут отображаться нулевые значения. Надеюсь, теперь я поняла.

ответ

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 
4

Вы должны смотреть в CASE...WHEN конструкцию, которая является эквивалентом IF...THEN в SQL:

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5078041.html

+0

+1, ваша ссылка для MS SQL, но это также самый простой способ в Oracle 8i, так или 9i ('decode' делает живой вид более твердого :)). ** Btw **, что другие СУБД реализуют CASE? –

+0

В теории это поддерживается всеми СУБД, как это стандарт, определенный в SQL-92 –

+0

Упс, кажется, что мы оба пропустили пункт вопроса –

0

При использовании SQLServer, посмотрите на сазе, он может делать то, что вы хотите. выбрать, б, случай, когда с не равно нулю, то «The не нулевое состояние» еще «Нулевое состояние конец [C] из Таблица T где условие

При использовании оракула, я думаю, вы можете использовать декодирование.

Cheers.

+0

Я попытался сделать что-то похожее на вас, но я не могу получить правильный синтаксис. Вот что я сделал до сих пор: SELECT RST.ParentId, RST.EventOn, CASE WHEN RST. [Пользователь] IS не является нулевым, а затем RST. [Пользователь] IS не является нулевым еще RST. [Пользователь] имеет значение FROM RangeSheetTime RST WHERE RST.ParentId = 3550 – Hallaghan

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 
) 

У меня нет никаких средств тестирования этого на данный момент, так что никаких гарантий.

+0

Я тестирую его прямо сейчас, Джефф, но мне это уже нравится, спасибо. – Hallaghan

0

Hallaghan, Вы спрашиваете о поисковых критериях или манипулировании/отображении результата SQL, если вы спрашиваете о манипулировании или отображение результата случае поможет вам еще союз выглядит хорошо для меня.

+0

Я объяснил это лучше сейчас в своем главном посте: это не соответствовало комментарию. – Hallaghan

0

идентификатор, ParentId пользователя, StartOrEnd

1, 31, нуль, 1

2, 31, 90, 1

3, 31, нуль, 0

и вы хотите скажем, если startorEnd имеет несколько значений для одного родительского идентификатора, вы хотите видеть только строку, где пользователь не равен null, иначе придет строка с нулевым пользователем.

, если это так, то ответ дается Джефф должен работать

Смежные вопросы