2017-01-23 4 views
3

Пожалуйста, сообщите, как изменить следующий код, чтобы извлечь также записи с [execute_status], например, «сбой» и в то же время [has_messages], как «0». Я пытаюсь по-разному, и все результаты включают в себя время has_messages как «0» и «1» :(Спасибо большое !!объединение операторов сравнения

SELECT * 
FROM (SELECT [id] 
      ,[type] 
      ,[created] 
      ,dateadd(s, created/1000, '19700101')as date_created 
      ,[state] 
      ,[execution_status] 
      ,[has_messages] 
     FROM [databasename].[tablename] 
     WHERE type like 'AccessRequest' 
     AND not state like 'Initialize') as jaro 
WHERE date_created between '2016-12-01' and '2016-12-31' 
ORDER by date_created 
+0

Вы можете показать некоторые данные образца и ожидаемый результат? –

+2

Покажите нам пример данных и ожидаемый результат. \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Почему вы используете 'LIKE'? Не '' '' работает для вас? –

ответ

0

Как об этом:.

SELECT * 
FROM (SELECT 
       id 
       ,type 
       ,created 
       ,dateadd(s, created/1000, '19700101') AS date_created 
       ,state 
       ,execution_status 
       ,has_messages 
     FROM databasename.tablename 
     WHERE (type = 'AccessRequest' 
     AND state != 'Initialize') 
      OR (execution_status = 'failure' 
     AND has_messages = 0) 
    ) AS jaro 
WHERE date_created >= '2016-12-01' <= '2016-12-31' 
ORDER BY date_created 
+0

Где вы закрываете подзапрос? зачем повторять условие даты? –

+0

Извините, пропустил ваш подзапрос, позвольте мне сделать коррекцию – dadde

+0

Не волнуйтесь, это не мое. Теперь вам нужно добавить еще одну скобку, чтобы покрыть условия «OR» –

3

Вот . куча предложений Во-первых, я хотел бы изменить таблицу, чтобы вычисляемый столбец для даты:.

alter table tablename add date_created as (dateadd(second, created/1000, '19700101')); 

Это позволит вам добавить индекс на столбце, который может ускорить запрос Затем, вы должны исправить ваши сравнения дат (читать Аарон отличное объяснение Бертрана What do BETWEEN and the Devil Have In Common?):

select t.* 
from tablename t 
where (date_created >= '2016-12-01' and date_created < '2017-01-01') and 
     ((type like 'AccessRequest' AND state not like 'Initialize') or 
     (execution_status like 'failure' and has_messages like '0') 
    ) 

Дополнительные комментарии:

  • Не следует использовать как для числовых значений. Если has_messages является числовым, просто используйте =.
  • Хотя вы можете использовать like для сравнения строк, многие люди согласятся, что = понятнее в намерениях.
  • Этот запрос по-прежнему будет получать значения, где has_message не 0, поскольку эти строки удовлетворяют исходному состоянию.
Смежные вопросы