Использование предложения iif в Ms Access для столбца с типом данных «Да / Нет» - PullRequest
3 голосов
/ 30 мая 2011

У меня есть столбец с именем DayShift в таблице типа данных Yes/No (логический).Вывод результата, который я хочу получить: если значение равно true, отобразить «Day», иначе отобразить night.

Я пробовал следующее:

SELECT iif(DayShift=Yes,"Day","Night") as Shift FROM table1;

SELECT iif(DayShift,"Day","Night") as Shift FROM table1;

SELECT iif(DayShift=True,"Day","Night") as Shift FROM table1;

SELECT iif(DayShift=1,"Day","Night") as Shift FROM table1;

Но ничего из вышеперечисленного не работает.Это просто дает мне список пустых флажков в окне выходных данных.Я использую MS Access 2003. Любая помощь приветствуется.

Обновление:

После небольшого исследования, что тип данных да / нет в Ms Access 2003 не может обрабатывать нулевые значения надлежащим образом.Отсюда и ошибка. Проверьте эту ссылку для подробностей.

Обновление 2

Реальный запрос с объединениями.Не упомянул об этом, так как я, хотя приведенная выше информация будет работать.

SELECT tblovertime.contfirstname                        AS [First Name], 
       tblovertime.contlastname                         AS [Last Name], 
       tblovertime.employeenumber                       AS [Employee Number], 
       tblsignup.thedate                                AS [Sign Up Date], 
       Iif([tblOvertime.DayShift] =- 1, "Day", "Night") AS shift, 
       (SELECT Mid(MIN(Iif(sector = 1, "," & sector, NULL)) & MIN( 
                               Iif(sector = 2, "," & sector, NULL)) & MIN( 
                               Iif(sector = 3, "," & sector, NULL)) & MIN( 
                           Iif(sector = 4, "," & sector, NULL)), 2) AS concat 
        FROM   tblempsectorlist 
        WHERE  tblempsectorlist.empnum = tblsignup.employeenumber 
        GROUP  BY empnum)                               AS sectors, 
       tblovertime.timedatecontact                      AS [Date Contacted], 
       tblovertimestatus.name                           AS status 
FROM   (tblsignup 
        INNER JOIN tblovertime 
          ON ( tblsignup.thedate = tblovertime.otdate ) 
             AND ( tblsignup.employeenumber = tblovertime.employeenumber )) 
       INNER JOIN tblovertimestatus 
         ON Clng(tblovertime.statusid) = tblovertimestatus.statusid 
WHERE  (( ( tblsignup.thedate ) ># 1 / 1 / 2011 # )) 
ORDER  BY tblsignup.thedate; 

Ответы [ 5 ]

3 голосов
/ 30 мая 2011

Ваш второй имеет право

SELECT iif(DayShift,"Day","Night") as Shift FROM table1;

Я предлагаю попробовать следующее, чтобы увидеть, что на самом деле оценивается

SELECT iif(DayShift,"Day","Night") as Shift, DayShift FROM table1;

Вы также можете сделать

SELECT iif(DayShift = -1,"Day","Night") as Shift FROM table1;

Поскольку MS Access хранит истину как -1 и ложь как 0 (это не так интуитивно понятно, как истина = 1, но, вероятно, быстрее оценивать в комплименте по двойке)

- edit -
Так как вы, кажется, используете соединение, которое может привести к Nul для Да / Нет, используйте функцию nz ().

select iff(nz(DayShift, 0), "Day","Night") as Shift FROM table1;

Когда выходит DayShiftnull, вместо этого будет возвращено 0 (false / no).

1 голос
/ 31 мая 2011

Это может быть глупо, но ....

Если в поле DayShift есть значения Null, Access не сможет оценить формулу.Вы можете написать свой тест следующим образом:

 iif(Nz(DayShift,0)=-1,"Day","Night")
0 голосов
/ 02 июня 2011

Ядро базы данных Access (ACE, Jet, что угодно) имеет умную / глупую функцию, которая позволяет выражению в предложении SELECT ссылаться на предложение AS («псевдоним столбца») в том же SELECTпредложение, если это предложение AS находится слева от выражения.Это облегчает тестирование выражений с тестовыми данными без использования таблицы вообще (при условии, что ANSI-92 Query Mode , я думаю), например, попробуйте выполнить любое из следующих утверждений по отдельности: все должно работать и выдавать ожидаемый результат.результат:

SELECT CBOOL(TRUE) AS DayShift, 
       IIF(DayShift = TRUE, 'Day', 'Night') AS Shift;

SELECT CBOOL(FALSE) AS DayShift, 
       IIF(DayShift = TRUE, 'Day', 'Night') AS Shift;

SELECT NULL AS DayShift, 
       IIF(DayShift = TRUE, 'Day', 'Night') AS Shift;

SELECT CBOOL(TRUE) AS DayShift, 
       IIF(DayShift, 'Day', 'Night') AS Shift;

SELECT CBOOL(FALSE) AS DayShift, 
       IIF(DayShift, 'Day', 'Night') AS Shift;

SELECT NULL AS DayShift, 
       IIF(DayShift, 'Day', 'Night') AS Shift;
0 голосов
/ 30 мая 2011

Вы связываетесь с «DayShift», а не с производным «Shift» в форме.

3-й запрос (=True) показывает, что при запуске в изоляции должен отображаться день / ночь.

0 голосов
/ 30 мая 2011

Я успешно выполнил следующий запрос:

SELECT IIf([Table1]![isDayShift]=True,"Day","Night") AS Shift
FROM Table1;

Я построил это в Access 2007 (извините, у меня не было копии 2003 года). Единственное отличие, которое я увидел, было то, что он давал полный путь к полю, а не просто имя поля. Однако это не должно быть проблемой. Если он дает вам флажки, может показаться, что он видит это поле не как текстовое, а как поле флажка.

Суть в том, что вышеуказанный запрос должен работать.

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