|
|
|
| Я написал запрос на выборку, в котором условие задается функцией:
SELECT * FROM MyTable WHERE MyTableID=GetMyTableID()
Все нормально работает.
Но мне надо, чтобы в некоторых случаях этот же запрос возвращал все записи.
В этих самых "некоторых случаях" я ничего лучше не придумал, как присвоить функции значение:
GetMyTableID() = "Like""*"""
или
GetMyTableID() = ">0"
И в результате выполнения запроса получал ошибку несоответствия типов. Смысл ошибки понятен - запрос ожидает Long, а функция возвращает ему String.
Пожалуйста, подскажите, как решить эту задачу, чтобы запрос мог делать то или другое: выводить все значения или делать выборку по условию-функции? Писать два разных запроса и вызывать либо тот либо другой, я не хочу - у меня получится слишком много запросов, здесь я привел упрощенный пример. Должно же быть какое-то решение, потому как задача повсеместная. | |
|
| |
|
|
|
| WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID],GetMyTableID())));
Соответственно функция должна возвращать "Черт его знает" в случаях когда нужно выбрать все записи | |
|
| |
|
|
|
| snipe, большое спасибо, все работает! | |
|
| |
|
|
|
| У меня еще вопрос касательно вот этого примера:
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID],GetMyTableID())));
Он выводит только те записи, где определен MyTableID, а как задать чтобы все записи выводил?
Я пробовал писать:
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID] or Is Null,GetMyTableID())));
или даже
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",Is Null,GetMyTableID())));
чтобы хотя записи с пустым полем MyTableID вывести
но он вообще ничего не выводит. Хотя если в условие записать просто Is Null, то работает. | |
|
| |
|
|
|
| WHERE (((IIf(GetMyTableID()="Черт его знает",([MyTable].[MyTableID])=[MyTableID] Or ([MyTable].[MyTableID]) Is Null,([MyTable].[MyTableID])=GetMyTableID()))));
так должно заработать | |
|
| |
|
|
|
| Пробовал по-всякому и так тоже. Че-то не работает. | |
|
| |
|
|
|
| SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
При необходимости получить все записи функция должна вернуть 0 | |
|
| |
|
|
|
| а вот это работает неправильно, потому что запрос в любом случае выводит все записи.
(1) или (не 1) = все множество целых чисел
(0) или (не 0) = все множество целых чисел | |
|
| |
|
|
|
|
| SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
Вариант 1.
GetMyTableID() вернет какое-то число <> 0
MyTableID=GetMyTableID() - истина только в том случае если MyTableID равно результату функции
Not GetMyTableID() - Not (Истина) - ложь при любом раскладе
т.е. в результате только т. записи которые соответствуют значению функции
Вариант 2.
GetMyTableID() вернет 0
MyTableID=GetMyTableID() - ложь в любом случае Кроме записи MyTableID = 0
Not GetMyTableID() - Not(Ложь) - истина при любом раскладе
Т.е все записи | |
|
| |
|
|
|
| Да, набил код и проверил, прежде чем написать ответ. А что, я разве не прав? | |
|
| |
|
|
|
| А я полагаю, что это не так. Причем здесь вообще истина/ложь? В выражении GetMyTableID() or Not GetMyTableID() не говорится об Истине или Лжи. Когда мы говорим MyTableID = Not GetMyTableID() - это значит, что MyTableID <> GetMyTableID() - проверьте сами. Access сам ставит "<>" вместо "= Not". Поэтому:
Вариант 1.
GetMyTableID() вернет какое-то число <> 0
WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
т.е. в предыдущей строке сказано, что MyTableID д.б. равен GetMyTableID() (в данном случае какому-то числу, отличному от нуля) или не равен GetMyTableID() (какому-то числу, отличному от нуля), т.е. запрос выведет все значения.
Вариант 2.
GetMyTableID() вернет 0 - тоже самое только вокруг нуля - множество чисел неравных нулю + сам нуль. | |
|
| |
|
|
|
|
Когда мы говорим MyTableID = Not GetMyTableID()
|
Во второй части условия (той что после OR) нет сравнения с MyTableID !!!
SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
|
Вы же, вероятно, написали
SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or MyTableID=Not GetMyTableID()
|
| |
|
| |
|
|
|
| Да, верно в той части нет сравнения с MyTableID, но Access сам его ставит. Я в конструкторе пишу в поле условия:
MyTableID=GetMyTableID() or Not GetMyTableID()
потом переключаюсь в SQL, и вижу, что исправлено на:
WHERE (([MyTableID]=GetMyTableID() Or Not [MyTableID]=GetMyTableID()))
Тут мне становится интересно: а вы сами пробовали так делать, как мне советуете?
Тогда я в режиме SQL правлю на:
WHERE (([MyTableID]=GetMyTableID() Or Not GetMyTableID()))
Переключаюсь в конструктор и вижу, что access из одной колонки MyFieldID сделал 2 колонки: MyTableID с условием GetMyTableID() и GetMyTableID с условием or false. Смысла в последнем вообще не вижу.
Ладно, выполняю запрос - он выводит все записи - это притом, что функция GetMyTableID() должна возвращать Null, потому что в ее теле записано: GetMyTableID() = MyTableIDValue, а переменной MyTableIDValue на тот момент вообще задано никакое значение.
Сорри, если утомил, просто охота докопаться до истины. Что я делаю не так? | |
|
| |
|
|
|
| MyTableID с условием GetAccountFilter() и GetMyTableID с условием or false. |
Так именно и должно быть.
Только для того что бы это работало функция GetMyTableID(), когда нужно вернуть все записи, должна возвращать 0 (ноль), но никак не NULL
Должно быть 2 условия соединенных OR
1-е
MyTableID = GetAccountFilter()
2-е
GetAccountFilter() = false | |
|
| |
|
|
|
| Спасибо, разобрался, все работает! Круто! Спасибо за ваше терпение и за науку.
Я понял, как это работает: когда запрос пытается выполнить MyTableID = GetAccountFilter(), а функция возвращает 0, то запрос не находит ни одной записи и тогда выполняет вторую часть условия или: GetAccountFilter() = false - в данном случае все записи соответствуют этому выражению, поэтому он их все и выводит. | |
|
| |
|
|
|
| Ну примерно так. | |
|
| |
|
|
|
| SELECT * FROM MyTable WHERE (([Некоторый случай]) OR (MyTableID=GetMyTableID()))
Где [Некоторый случай] - условие, при котором должны возвращаться все записи. | |
|
| |