SQl Используйте IIF для сравнения двух значений в одной строке

Я использую SQL в MS Access, и мне нужно сравнить 2 значения подряд, чтобы определить результат третьего поля. Поле «Yearmove» имеет значение не во всех случаях. Вот тестовый код, который я запускаю

SELECT z.SCHOOL, z.Year as Year,  ProgBuild.BldgNo, ProgMoveBuild.yearmove AS Yearmove,
IIF([Year]=[Yearmove], 1, 0) AS Result

Результаты хороши в тех случаях, когда «Yearmove» пусто и показывает 0, как и ожидалось. Anyplace «Yearmove» имеет номер, в поле «Результат» указано «#ERROR», поэтому как при выполнении условия, так и при его отсутствии. Я попытался заполнить поле «ГОД» как текстом (например, «2014»), так и нетекстом (например, 2014), но получил тот же результат. Все данные числовые. Вот как выглядит часть результатов:

SCHOOL  Year    BldgNo  Yearmove    Result
254     2014     254                   0
256     2014     256                   0
260     2014     260                   0
261     2014     261                   0
262     2014     202                   0
301     2014     301                   0
307     2014     307     2019        #ERROR
313     2014     313     2019        #ERROR
314     2014     314                   0
321     2014     321                   0
322     2014     322                   0

person yope    schedule 03.03.2015    source источник
comment
Не могли бы вы предоставить образцы данных (полная строка с результатом выражения) и типы данных для всех задействованных столбцов, пожалуйста?   -  person Brad    schedule 03.03.2015
comment
Как лучше всего вставить данные таблицы?   -  person yope    schedule 03.03.2015
comment
Закрывать. Вы можете отредактировать свой вопрос и использовать некоторые инструменты форматирования, чтобы сделать его более читабельным. Я бы сделал это, но похоже, что у вас 5 столбцов и 44 фрагмента данных, и я не уверен, где разрывы строк. Плюс никаких значений #ERROR?   -  person Brad    schedule 03.03.2015
comment
Добавлены данные о результатах в исходный пост   -  person yope    schedule 03.03.2015
comment
Вы уверены, что все ваши данные числовые? Каковы типы данных в таблице, из которой вы выбираете эти данные? Если я изменяю любой из типов данных z.Year или ProgMoveBuild.yearmove на текст, я получаю эту ошибку. т.е. они разные, эта ошибка произойдет. Если они совпадают (текст или число), ошибка не возникает.   -  person Brad    schedule 03.03.2015
comment
Бред, ты был прав, это было несоответствие типов, спасибо за помощь.   -  person yope    schedule 03.03.2015


Ответы (1)


Этот запрос выдает ошибку "Несоответствие типа данных в выражении критерия":

SELECT IIf('2014'=2014, 1, 0)

Поэтому я подозреваю, что ваши поля Year и yearmove имеют разные типы данных: один числовой; а другой текст.

Узнайте, с какими типами данных вы имеете дело...

SELECT
    z.Year,
    TypeName(z.Year) AS TypeOfYear,
    ProgMoveBuild.yearmove,
    TypeName(ProgMoveBuild.yearmove) AS TypeOfyearmove
FROM [whatever you have now as your data source(s)]

Если изменение типа данных одного из этих полей нецелесообразно, вы можете привести значения поля к другому типу для условия IIf в вашем запросе. CStr() преобразует числовое значение в строку. И Val() преобразует строковое значение в число. Однако любая из этих функций будет жаловаться, если вы дадите им Null. Таким образом, вы можете использовать Nz(), чтобы заменить Null чем-то другим, прежде чем передать значение CStr() или Val().

person HansUp    schedule 03.03.2015
comment
Спасибо за это, это было несоответствие типов, я думаю, что это решено. - person yope; 03.03.2015