Доступ к оператору IIF запроса к запросу SQL Server - PullRequest
0 голосов
/ 22 октября 2019

Проблема: Я пытаюсь заставить приведенный ниже код работать в SQL Server.

Я изначально написал код в запросе MS Access, но теперь мне нужно использовать его в SQL Server. У меня проблема в том, что операторы IIF не работают в SQL Server.

Я пытался использовать оператор Case, но в итоге он запустил мой SQL Server и никогда не загружал никаких данных. Есть ли какие-либо предложения о том, как преобразовать оператор IIF для использования в SQL Server? Любая обратная связь будет оценена. Спасибо!

Код, написанный в запросе MS Access:

SELECT 
    Customer.CustomerID, 
    IIf([ExpenseCode].[SysCode] >= '1747', [Amount], 0) AS Trains
FROM   
    Customer 
LEFT JOIN 
    (Expense 
LEFT JOIN 
    ExpenseCode ON Expense.SysCode = ExpenseCode.SysCode) ON Customer.CustomerID = Expense.EntityID;

Попытка решения в SQL Server:

SELECT DISTINCT
    r.CustomerID,
    CASE
        WHEN t.SysCode = '1747'
           THEN e.Amount
        ELSE NULL
    END AS Trains
FROM
    ExpenseCode AS t, Expense AS e, Customer AS r

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

IIF() поддерживается в SQL Server начиная с версии 2012. В запросе MS Access необходимо изменить синтаксис объединения.

Попробуйте:

SELECT 
    c.CustomerID, 
    IIf(ec.SysCode >= 1747, Amount, 0) AS Trains
FROM   
    Customer c
    LEFT JOIN Expense e ON c.CustomerID = e.EntityID
    LEFT JOIN ExpenseCode ec ON e.SysCode = ec.SysCode;

Я также добавил псевдонимы таблиц в ваш запрос, поскольку они делают его более читабельным (добавьте соответствующий префикс в столбец Amount). Наконец, я посчитал, что SysCode было числом, поэтому я удалил окружающие кавычки вокруг значения для сравнения (если это действительно строка, вы можете поместить кавычки обратно).

Если вы используете SQL Server<2012, вот это <code>CASE sytanx:

SELECT 
    c.CustomerID, 
    CASE WHEN ec.SysCode >= 1747 THEN Amount ELSE 0 END AS Trains
FROM   
    Customer c
    LEFT JOIN Expense e ON c.CustomerID = e.EntityID
    LEFT JOIN ExpenseCode ec ON e.SysCode = ec.SysCode;
0 голосов
/ 22 октября 2019

Ваш код должен работать в SQL Server. Я бы предпочел записать это как:

SELECT c.CustomerID, 
       (CASE WHEN ec.SysCode >= '1747' THEN e.Amount ELSE 0 END) AS Trains
FROM Customer c LEFT JOIN 
     Expense e
     ON c.CustomerID = e.EntityID LEFT JOIN 
     ExpenseCode ec
     ON e.SysCode = ec.SysCode;

Это предполагает, что Amount исходит от Expense.

Изменения:

  • SQL Server (и никаких других баз данных!) требуют, чтобы эти неуклюжие круглые скобки содержали несколько JOIN s.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • CASE - это стандарт SQL для условиявыражений, хотя SQL Server «модифицирует» IIF() для совместимости с MS Access.
  • Уточните все ссылки на столбцы!
...