Оператор IIf манипулирует только частью данных в поле

Я создал оператор IIf в запросе MS Access, чтобы заполнить пустые пробелы в определенном поле. Заявление затрагивает только некоторые данные, но не все. Почему это будет работать только на определенном проценте записей?

Field:Line_off_Date

Table:Claims

Criteria:IIf(IsNull("Line_off_Date "),"1/1/1900"

Вот официальный Sql после разграничения:

SELECT Claims.Line_off_Date 
FROM Claims
WHERE (((Claims.Line_off_Date)=IIf("Line_off_Date IsNull",#1/1/1900#,"Line_off_Date ")));

Я не могу сделать снимок экрана на этом сайте, но я могу сделать макет:

Line_off_Date

12/23/2013 12/23/2013 5/16/2010 1/1/1900 1/1/1900

12/10/2000 11/4/2008

Это указано в виде столбца с пробелом между 01.01.1900 и 10.12.2000. Когда я публикую его здесь, он превращается в абзац. Надеюсь, это хоть как-то поможет...


person autumntiger    schedule 23.12.2013    source источник
comment
Возможно ли, что в других записях есть пробел, а не нуль? Проверьте длину полей для этих записей   -  person Barbara Laird    schedule 23.12.2013


Ответы (1)


Я не уверен в вашей цели, но это похоже на то, где вы могли бы использовать Функция Nz.

Criteria: Nz(Line_off_Date, "1/1/1900")

Если вместо этого вы хотите IIf, попробуйте так...

Criteria: IIf(Line_off_Date Is Null, "1/1/1900", Line_off_Date)

Обратите внимание, что эти предложения предполагают, что Line_off_Date является текстовым типом данных. Если это действительно дата/время, разделите значение # вместо кавычек.

Criteria: Nz(Line_off_Date, #1/1/1900#)
Criteria: IIf(Line_off_Date Is Null, #1/1/1900#, Line_off_Date)

Я еще больше запутался, увидев ваш пункт WHERE ...

WHERE (((Claims.Line_off_Date)=IIf("Line_off_Date IsNull",#1/1/1900#,"Line_off_Date ")));

Помимо проблем с цитированием и так далее, я думаю, что логика ошибочна. Если вы скажете "покажите мне строки, где Line_off_Date = что-то другое, чем то, что хранится в Line_off_Date", вы можете не получить никаких строк обратно.

Думаю, вам нужен другой подход. Если вам нужна дополнительная помощь, покажите нам краткий набор примеров данных и желаемый результат на основе этих данных.

Основываясь на обсуждении комментариев, я понимаю, что вы на самом деле не хотите фильтровать набор результатов на основе Line_off_Date --- что означает, что это не проблема с пунктом WHERE. Вместо этого вы хотите получить значения Line_off_Date, но замените #1900-1-1# на любые значения, которые являются нулевыми. Если это правильно, выполните преобразование с выражением поля в предложении SELECT.

SELECT Nz(Claims.Line_off_Date, #1900-1-1-#) AS Line_off_Date_adjusted 
FROM Claims;
person HansUp    schedule 23.12.2013
comment
Я проверил длину записи, и, кажется, все в порядке. Я только что попытался использовать предложенную вами функцию Nz, но получил ошибку несоответствия типа данных, что кажется очень загадочным... - person autumntiger; 23.12.2013
comment
Это моя вина, что я предложил предположение, основанное на ограниченной информации. Пожалуйста, измените свой вопрос, чтобы включить SQL из запроса, который дает вам это сообщение об ошибке. - person HansUp; 23.12.2013
comment
Одно из полей Line_off_Date, некоторые записи не имели значения после импорта, почему не знаю.? Итак, чтобы все работало с соединением, над которым я работал, мне нужно указать дату/время. Я просто попытался разграничить, согласно вашему предложению, с помощью IIf, но он все равно возвращает нулевое значение для некоторых записей. Имеет ли это смысл? Не твоя вина; Я ценю ВСЮ вашу помощь! Вот SQL: SELECT Claims.Line_off_Date FROM Claims WHERE (((Claims.Line_off_Date)=IIf(Line_off_Date IsNull,#1/1/1900#,Line_off_Date ))); - person autumntiger; 23.12.2013
comment
@autumntiger: У вас есть речевые метки около ...IIf("Line_off_Date IsNull",... в коде, который вы указали в комментарии, — попробуйте удалить речевые метки. - person Paul; 23.12.2013
comment
@autumntiger: На самом деле, сотрите это - ваша строка тарабарщина, поэтому вокруг нее речевые метки. Между Is и Null должен быть пробел: SELECT Claims.Line_off_Date FROM Claims WHERE (((Claims.Line_off_Date)=IIf([Line_off_Date] Is Null, #1/1/1900#, [Line_off_Date]))); - person Paul; 23.12.2013
comment
Я попытался поставить пробел между Is и Null, но он все равно не вернул значение для последних 1990 записей. Что еще более странно, так это то, что я только что получил сообщение об ошибке, в котором говорилось, что я превысил систему!?!? Очень интересно... - person autumntiger; 23.12.2013
comment
Пожалуйста, объясните на английском языке, а не на языке SQL, ваши Line_off_Date критерии отбора. Каким конкретным условиям должно удовлетворять это поле, чтобы оно возвращалось вашим запросом? - person HansUp; 23.12.2013
comment
По сути, если он вообще не имеет значения (это тип данных даты/времени), я хочу, чтобы он был заполнен 01.01.1900. На прошлой неделе вы очень помогли в вопросе, который я опубликовал о соединении запроса и таблицы и обнаружении несоответствия типов данных; это продолжение того вопроса....помогает? - person autumntiger; 23.12.2013
comment
@HansUp Это не позволило бы мне сделать снимок экрана. Я мог бы дать макет представления: - person autumntiger; 23.12.2013
comment
Нет. Если я до сих пор не понял, к чему вы стремитесь после всех этих усилий, мне неразумно тратить больше своего времени. - person HansUp; 23.12.2013
comment
Я понимаю, и я ценю помощь. Я уверен, что это что-то маленькое, чего не хватает, и в какой-то момент это даст о себе знать. Все ваши сообщения были полезными и поучительными, и они помогут мне в будущем. - person autumntiger; 23.12.2013
comment
Спасибо за ваш любезный ответ. Однако я думаю, что вы должны отказаться от этого ответа, потому что он не решил вашу проблему. Сохраните согласие в качестве мотивации/награды для тех, кто сможет найти нужный вам ответ. - person HansUp; 23.12.2013