powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Любое значение во WHERE
10 сообщений из 10, страница 1 из 1
Любое значение во WHERE
    #34879517
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача на простом примере.

Делается запрос на php:
pg_query_params($conn, 'SELECT * FROM med_card WHERE gender=? AND age_min<? AND age_max>?', array('m', 20,30))

В общем такой механизм наверное не только в php есть.
Бывает что нужно искать записи где gender=f, либо gender=m, либо вообще пофиг. Как в таком случае указать что подходит любое значение?
В документации я не нашел как это сделать. Попытка методом тыка выполнить в PgAdmine запросы типа
select * from med_card where gender= and age_min<30, age_max>30
select * from med_card where gender=* and age_min<30, age_max>30
select * from med_card where gender=ANY and age_min<30, age_max>30
select * from med_card where gender=ANYVAL and age_min<30, age_max>30
успехов не принесла

Сразу хочу уточнить, я знаю что есть слово ANY в синтаксисе
SELECT * FROM smtg WHERE a= ANY(smtg_arr) и что это не то.
Также я знаю что pg_query_params при подставлении значений добавляет кавычки и
pg_query_params($conn, 'select * from med_card where gender=? and age_min=?, age_max=?', array('ANY', 20,30))
равно
select * from med_card where gender='ANY' and age_min=30, age_max=30
Вариант составлять WHERE-часть врукопашную, тоже не вызывет особого оптимизма. В общем-то можно, но не технично.

Мне сейчас интересна принципиальная возможность составления запроса такого типа.
Насколько я понимаю ничего сложного в реализации этой фишки нет, нужно всего лишь при разборе запроса не включать части условия, в которых есть выражение типа a=ANYVAL в query tree. Могу предположить что такую проверку нужно делать где то в том же районе, что и проверку на a=NULL и что на производительности это не дожно сказаться. Возможно это даже можно самому поправить в исходниках PostgreSQL.
С другой стороны, возможно, я недокурил мануалы и такая возможность уже есть.
Просветите, плиз.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34879538
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если искомое значение для gender передается в виде переменной подстановки, то можно записать что-то типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
where (
         gender = :value_for_gender and :value_for_gender is not null 
         or 
         :value_for_gender is null)
  and  age_min<? AND age_max
...
В этом случае, если вместо :value_for_gender передаит конкретное значение, то поиск будет идти по этому значению. Если же передать NULL, то поиск будет идти без учета фильтра по полю gender
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34879678
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя ли
Код: plaintext
1.
2.
3.
4.
if gender = пофиг then
 pg_query_params($conn, 'SELECT * FROM med_card WHERE age_min<? AND age_max>?', array( 20 , 30 ))
else
 pg_query_params($conn, 'SELECT * FROM med_card WHERE gender=? AND age_min<? AND age_max>?', array('m',  20 , 30 ))
За синтаксис не бейте, php не знаю.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34879686
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngel
Мне сейчас интересна принципиальная возможность составления запроса такого типа.

Извините, что-то я с утра не проснулся.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880007
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngel
Мне сейчас интересна принципиальная возможность составления запроса такого типа.

хотя смысла в том не вижу (нужно таки строить иной план запроса, а не пытацо...блаблабла), но с Like вместо = должно прокатить.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880174
Rastafarra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...
такие строки имхо вполне можно клеить... нет?

$sqlstr = "selet * from t where x";
if (a) $sqlstr .= " ,y";
if (b) $sqlstr .= " ,z";

или я не понял вопрос?
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880258
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321: Хотелось бы чтобы наличие этого кодового слова также аннулировало бы условия поиска с < и >
rastafarra: суть вопроса в том что в ряде можно один раз сформировать запрос, а потом 1000 раз его выполнить, подставляя разные значения. Вроде бы как это быстрее. Кроме того, на мой взгляд, это удобнее.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880512
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngel4321: Хотелось бы чтобы наличие этого кодового слова также аннулировало бы условия поиска с < и >
rastafarra: суть вопроса в том что в ряде можно один раз сформировать запрос, а потом 1000 раз его выполнить, подставляя разные значения. Вроде бы как это быстрее. Кроме того, на мой взгляд, это удобнее."это быстрее" если план запроса соответствует. а при замене условия "=" на "любое" план запроса, быстрый для "=" будет нервно курить в сторонке. поэтому предлагаю вам застрелиться с вашими соображениями о быстроте и удобстве. падобрамуканешна. т.е. гуманно - из духового ружжа. не надо изобретать глупостей.
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880586
Rastafarra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngelВариант составлять WHERE-часть врукопашную, тоже не вызывет особого оптимизма. В общем-то можно, но не технично.
пардон, вот это я пропутил...

но, имхо, было бы здорово передавать именованный массив.
pg_query_params($conn, 'SELECT * FROM med_card WHERE gender=? AND age_min<? AND age_max>?', array('gender'=>'m', 'age_min'=>20, 'age_max'=>30))
или
pg_query_params($conn, 'SELECT * FROM med_card WHERE gender=? AND age_min<? AND age_max>?', array('age_min'=>20, 'age_max'=>30, 'gender'=>'m'))

а для этого надо писать процедуру pg_query_params, в которой этот where и собирать в зависимости от.

хм... вообще занятно, надо попробовать такую штуку реализовать :)
...
Рейтинг: 0 / 0
Любое значение во WHERE
    #34880714
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShadyAngelВариант составлять WHERE-часть врукопашную, тоже не вызывет особого оптимизма. В общем-то можно, но не технично.мы так делаем тынц (PERL)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Любое значение во WHERE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]