Понимание SQL-запроса Microsoft Office Access с помощью «IIF» - PullRequest
2 голосов
/ 30 марта 2011

В более крупном проекте я переносю десятки запросов из базы данных Microsoft Office Access (MDB) в Oracle.

Хотя я смог понять почти все безумные конструкции, которые можно писать в Access, мне не удалось найти одну.

(упрощенный) запрос:

SELECT *
FROM SomeTable

WHERE 
Left(SomeField,3)=IIf(SomeParameter="GYM",Mid(SomeField,2,1)<>'0') 

AND 
Left(SomeField,3)=IIf(SomeParameter="GYM",Left(SomeField,3)<>'110')

Здесь SomeField - это столбец в таблице, а SomeParameter - это входные данные для запроса.

Что я не понимаю, так это WHERE часть:

  • Почему в выражении IIF отсутствует часть else?
  • Почему строка сравнивается с результатом операции <> (т.е. с логическим значением)?

Поскольку он успешно работает в Access, запрос является действительным. Я даже не смог сгенерировать некоторые тестовые данные, которые выдержат сравнение.

Любые советы о том, как интерпретировать сравнение?

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Как я сказал в комментарии, я разделяю озадачение оригинального спрашивающего по этому выражению:

  WHERE Left(SomeField,3)=IIf(SomeParameter="GYM",Mid(SomeField,2,1)<>'0')

Давайте распакуем это:

Если SomeParameter = "GYM", вернуть это:

  Mid(SomeField,2,1)<>'0'

Это проверка второго символа в SomeField на соответствие строке «0», так что это означает, что имеется плохо спроектированное поле, в котором второй символ в этом поле имеет независимое значение. Это вернет true для всех значений, где 2-й символ не равен 0.

Что бы он ни возвращал (True или Null в случае False), он будет сравниваться с этой строкой:

  Left(SomeField,3)

Если первые три символа SomeField оказываются «Да», то это вполне может привести к истинному сравнению, поскольку в Access / Jet / ACE значения «Да» и «Истина» и «-1» эквивалентны, а строковые представления могут быть неявно принуждают.

Итак, это может вернуть строки, которые выглядят так:

  SomeParameter  SomeField
  GYM            Yes sir, that's my baby

Однако, это действительно не имеет большого смысла, так как тест SomeField является круглым. То есть вы сравниваете первые 3 символа поля в случае, когда истинное сравнение может произойти только тогда, когда первые три символа имеют значение «Да», но вы, в свою очередь, сравниваете эти первые три символа с тестом. для того, является ли 2-й символ в том же поле <> 0. Во всех случаях, когда первые три символа "Да", тогда второй символ определенно не будет "0", так что вам действительно нужно только проверить значение первого три символа.

Я голосую за некомпетентность со стороны первоначального разработчика.

1 голос
/ 30 марта 2011

Первый iif вернет Null, если SomeParameter<>"GYM", в противном случае он вернет True или False в зависимости от логической оценки выражения Mid(SomeField,2,1)<>'0'.

Та же логика для второго ИИФ.

Дай угадаю .... это запрос в финансовой индустрии? ; -)

1 голос
/ 30 марта 2011

С http://www.techonthenet.com/access/functions/advanced/iif.php

iif ( condition, value_if_true, value_if_false )

Так что это похоже на троичный оператор в C ++ / C # и т. Д. Похоже, что им все равно, если значение равно false.

Кроме того,Интересно, они не испортили логику:)

РЕДАКТИРОВАТЬ Я полагаю, что возвращается Null, если не указано ложное условие.

В этом случае ономожет показаться, что они устанавливают для поля значение true (когда условие <> истинно) или null, когда оно ложно.

Для меня это выглядит странно

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