|
|
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Имеется запрос (встроенный в процедуру) с N параметров, запрос выбирает записи где все значение совпадают: where (col1 = :par1) and (col2 = :par2) .... как сделать, чтобы в качестве параметров можно было заводить NULL и чтобы работало корректно. В таком виде запрос не выдает записей, даже когда и COL1 - NULL и PAR1 - NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 15:34 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Быстро прячся!!! Сейчас в тебя будут кидаться томами Дейта, жаловаться на незнание молодым поколением реляционной теории и трехзначной логики, и вообще... Короче, NULL в теории ничему не равен, даже самому себе. (для этого IS NULL/NOT NULL и нужны) Стало быть, единственный способ - заменять = на IS NULL прямо в тексте запроса... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:16 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Т.е.: where ((:par1 Is Null) Or (col1 = :par1) ) and ((:par2 Is Null) Or (col2 = :par2)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:43 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Поспешил. Надо так: Т.е.: where (((:par1 Is Null) And (col1 Is Null)) Or (col1 = :par1) ) and (((:par2 Is Null) And (col2 Is Null)) Or (col2 = :par2)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:47 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Нее... Ведь при такой конструкции NULL'ы будут возвращаться всегда, даже если par1, par2 - не NULL.... А это, вопрошавшему, как я понял, не нада... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:47 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Ну да, это я как раз и заметил :-), потому поправился... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:48 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
возражение снимается, мысль гениальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2002, 17:48 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Решение (A=B)or((A is NULL)and(B is NULL) я нашел сам, но кроме этого проверил еще 2 варианта: STOREDPROC: Для каждого типа данных пишется "булевая" процедура, сначала проверяющая на нулы, а затем сравнивает. Кстати, хотя читается в итоге легче, но работает слегка медленнее. Но первый метод не годится!!! в ISQL!!! 3 - c UDF-ами - возможно самый быстрый, но одна проблема - строки действительно передаются nil-ами, а вот например NULL интеджера передается все равно как 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 09:54 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
(A=B)or((A is NULL)and(B is NULL) Этот вариант давно известен, но делает не совсем то, о чем вы говорили в начале... Так зачем людей было дурить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 12:15 |
|
||
|
Параметризованный запрос с NULL
|
|||
|---|---|---|---|
|
#18+
Не знаю, как в IB, но в FB (1.5) корректно сравнить данные можно с использованием такой конструкции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2003, 22:53 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32073032&tid=1579742]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
206ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 558ms |

| 0 / 0 |
