Количество параметров в SELECT

Полуламер
Дата: 16.01.2012 12:39:59
Господа аксцессологи, простите мое невежество, но не нашел в сети ничего дельного по своему вопросу. Собственно, хотелось бы понять тонкости механизма SELECT-запроса, когда в нем присутствуют параметры. Допустим, это выглядит так:
SELECT Field1,Field2 FROM Examples where iif(:Number is NULL,[Field3] is NULL,[Field3]=:Number)

Признаюсь честно, что для меня такой хитрый SQL-финт в новинку, никогда не использовал подобного. Так вот, когда такое стартуешь из облочки акса, то параметр Number запрашивается только один раз, но если пытаться такое повторить либо из VBA, либо из какого-то другого языка, понимающего ADO, становится ясно, что параметров этих в такой строке на самом деле два, хотя название у них одинаковое. Вот и хотелось бы понять, почему в этом случае их два. Само собой напрашивается детское объяснение - раз два двоеточия, то и параметров тоже два, но это ведь из серии "деревья качаются, оттого и ветер". Буду очень благодарен за науку или какие-то конкретные тынцы
WRX
Дата: 16.01.2012 13:07:26
Полуламер
Господа аксцессологи
звучит как то вообще ужасно, ИМХО
Программист-Любитель
Дата: 16.01.2012 13:13:23
SELECT Field1, Field2 
FROM Examples 
WHERE Number is NULL OR Field3=Number

Ну и там вверху джетовское ...Parameters Number... - я джетовский синтаксис не знаю.
Полуламер
Дата: 16.01.2012 13:32:59
звучит как то вообще ужасно, ИМХО

Я же пошутил! Уж и пошутить нельзя!

Программист-Любитель
SELECT Field1, Field2 
FROM Examples 
WHERE Number is NULL OR Field3=Number

Ну и там вверху джетовское ...Parameters Number... - я джетовский синтаксис не знаю.

Во-первых, такой запрос будет фильтровать как записи с нулевыми значениями для Field3, так и те, у которых Field3=Number, а мне это не нужно, для того и использую iif. А во-вторых, никаких джетовских Parameters Number по-моему не существует.
studieren
Дата: 16.01.2012 13:38:43
Полуламер,

PARAMETERS Number Long;
SELECT Field1,Field2
FROM Examples
WHERE IIf(Number is NULL, [Field3] Is NULL, [Field3]=Number)

По хорошему надо объявлять параметры и тогда таких вопросов не будут возникать. :)
studieren
Дата: 16.01.2012 13:40:23
Полуламер,

А вообще Ваш запрос эквивалентен к следующему запросу:
PARAMETERS Number Long;
SELECT Field1,Field2
FROM Examples
WHERE (Number Is NULL And [Field3] Is NULL) OR [Field3]=Number
Полуламер
Дата: 16.01.2012 14:59:56
studieren, благодарю за помощь - это то, что надо и отлично работает!
Полуламер
Дата: 19.01.2012 13:11:48
Есть еще пра интересных вопросов, буду очень благодарен за любую помощь:

1. Акс вполне разрешает называть параметры точно так же как и поля из таблицы, значения присваиваются, все вроде нормально. Однако следующая конструкция возвращает все записи, это и понятно, потому что она неправильная:
PARAMETERS STATUS integer, PNR long;
SELECT Gname,SVNr FROM Test where ((STATUS Is NULL And [Status] Is NULL) OR ([Status]=STATUS)) AND ((PNR Is NULL And [pnr] Is NULL) OR ([pnr]=PNR));

Естественно выделенные большими буквами параметры акс воспринимает как имена полей. Можно ли как-то акцентировать в запросе, что это именно параметры? Нужен какой-то префикс типа <имя таблицы>.<параметры>.Status ?

2. Хотя вариант без iif вполне прилично отрабатывает, хотелось бы испытать и вариант с iif, чтобы оценить скорость обработки. Например, конструкци для двух параметров + iif выглядит у меня следующим образом:
PARAMETERS St integer, pn long;
SELECT Gname,SVNr FROM Test where iif((st Is NULL) ,
iif([Pnr] Is NULL,([Status] Is NULL) and ([Pnr] Is NULL),([Status] Is NULL) and ([Pnr]=pn)),
iif([Pnr] Is NULL,([Status] = st) and ([Pnr] Is NULL),([Status]=st) and ([Pnr]=pn)));

И это всего-навсего для двух полей / параметров! А если их будет, скажем, шесть? Конструкция типа
... WHERE ( iif(...) AND iif(...) )

заведомо ошибочна. Не подскажете, можно ли упростить что-то в данном случае?
Полуламер
Дата: 19.01.2012 13:25:19
Так, с первым вопросом сам разобрался - действительно для параметров с такими специфическими именами следует указывать имя таблицы, т.е. test.Status, но при этом не забывать брать имена полей в квадратные скобки, чтобы акс понимал, что это именно значения из полей. Теперь хотелось бы услышать какой-нибудь позитив касательно второго вопроса
нраи
Дата: 19.01.2012 13:35:31
Полуламер
Так, с первым вопросом сам разобрался - действительно для параметров с такими специфическими именами следует указывать имя таблицы, т.е. test.Status, но при этом не забывать брать имена полей в квадратные скобки, чтобы акс понимал, что это именно значения из полей. Теперь хотелось бы услышать какой-нибудь позитив касательно второго вопроса
лично я в таком случае делаю цепочку запросов, в каждом из которых считается своя часть логики. Иначе потом концы плохо находятся. Если все совсем сложно, тут уже на вба.