Могу ли я указать значение IIF в предложении where - PullRequest
0 голосов
/ 12 марта 2020

Я пишу отчет в Excel, который запрашивает данные из таблицы ODB C.

Я хотел создать новый столбец для критериев поиска и использовать его в предложении where. например:

SELECT 
SO_Site,
SO_Customer,
IIF((SO_PERFORM_DATE)<GetDate(),'Backlog','Normal') AS 'ISBACKLOG'

FROM WAREHOUSE.FAKESALESORDES

WHERE SO_Site=1234 AND ISBACKLOG='Backlog'

Цель этого состояла в том, чтобы возвратить заказы отставания, без оговорок о супер беспорядке where, чтобы другие могли интерпретировать этот запрос в будущем.

Любые советы будут очень полезно!

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Конечно, есть способы обойти это. Но вам нужно научиться ходить, прежде чем пытаться бежать. Это не царапает поверхность сложного или грязного! Но вы можете использовать CTE во многих случаях, чтобы уменьшить визуальную сложность или дублирование. Пример:

WITH ORDERS as (
    SELECT 
       SO_Site,
       SO_Customer,
       CASE WHEN SO_PERFORM_DATE < GetDate() THEN 'Backlog' 
            ELSE 'Normal' END ) AS ISBACKLOG
FROM WAREHOUSE.FAKESALESORDES 
)
select SO_Site, SO_Customer, ISBACKLOG
from ORDERS where ISBACKLOG = 'BackLog'
order by ...; 

Демо как fiddle . Вы также можете рассмотреть возможность использования представления или вычисляемого столбца

0 голосов
/ 13 марта 2020

Вы не можете ссылаться на именованный псевдоним в его собственном WHERE, как это.

Вам просто нужно поместить все IIF в операторе WHERE так же, как в SELECT

SELECT 
    SO_Site,
    SO_Customer,
    IIF((SO_PERFORM_DATE)<GetDate(),'Backlog','Normal') AS 'ISBACKLOG'

FROM 
    WAREHOUSE.FAKESALESORDES

WHERE 
    SO_Site=1234 
    AND IIF((SO_PERFORM_DATE)<GetDate(),'Backlog','Normal')='Backlog'

Хотя, глядя на условия в IIF, вы можете упростить это еще больше, просто посмотрев, где дата меньше GETDATE()

SELECT 
    SO_Site,
    SO_Customer,
    IIF((SO_PERFORM_DATE)<GetDate(),'Backlog','Normal') AS 'ISBACKLOG'

FROM 
    WAREHOUSE.FAKESALESORDES

WHERE 
    SO_Site=1234 
    AND SO_PERFORM_DATE<GetDate()
0 голосов
/ 12 марта 2020

Вам нужен оператор CASE, например:

SELECT * FROM (
  SELECT 
  SO_Site,
  SO_Customer,
  CASE WHEN SO_PERFORM_DATE < GetDate() THEN 'Backlog' ELSE 'Normal' END AS 'ISBACKLOG'
  FROM WAREHOUSE.FAKESALESORDES
  WHERE SO_Site=1234
)  a
WHERE a.ISBACKLOG='Backlog';

Подробнее об этом можно прочитать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...