Как текст преобразовать в часть запроса?

Generalproger
Дата: 06.03.2015 16:55:32
Здравствуйте, столкнулся с проблемой:
Есть таблица py в которой есть массив data который хранит идентификаторы строк другой таблицы. С помощью переборки через array_agg и еще пары приколов результат получатся что data: id = 3 OR id = 6 OR id = 9, попытался реализовать выборку так: WHERE py.data что естественно не получилось.
Как преобразовать тип text в такой тип что бы он выполнился как часть SQL запроса?
CAST(data AS query) естественно не прокатывает))))
id in массив
Дата: 06.03.2015 17:17:24
Generalproger,

Зачем было собирать в строку?
лопата
Дата: 06.03.2015 17:46:24
Generalproger
Здравствуйте, столкнулся с проблемой:
Есть таблица py в которой есть массив data который хранит идентификаторы строк другой таблицы. С помощью переборки через array_agg и еще пары приколов результат получатся что data: id = 3 OR id = 6 OR id = 9, попытался реализовать выборку так: WHERE py.data что естественно не получилось.
Как преобразовать тип text в такой тип что бы он выполнился как часть SQL запроса?
CAST(data AS query) естественно не прокатывает))))

те чо надо ?

не надо рассказывать что пытаешься накрутить, не сказав сначала -- а для нафига.

если хочешь типа
WHERE ARRAY[3,6,9] && py.data 
-- то никакой подстановки пошитой вручную поцами с малой арнаутовской строки не надо -- надо так и писать
инъектор эскьюэл
Дата: 06.03.2015 18:04:32
Alex Marmuzevich
Типа такого?
http://stackoverflow.com/questions/7433201/are-there-any-way-to-execute-a-query-inside-the-string-value-like-eval-in-post
осталось выяснить, что станется с переданными в строке переменными типа id.
Generalproger
Дата: 06.03.2015 19:20:18
лопата,

Смотрите, есть выборка из БД к примеру SELECT ARRAY[pole_data,pole_param,pole_special] поле data это массив идентификаторов по которым надо сделать выборку из другой БД, на других форумах сказали что так сделать невозможно силами простого sql и я решил пойти и сделать функцию на это дело, если уже обсуждать функцию то получается вот что:

CREATE OR REPLACE FUNCTION func_a(data text[] = '{}')
RETURNS json AS $func$
BEGIN
константа qu = QUERY EXECUTE 'SELECT array_to_string(data, ' OR id = ');';
RETURN QUERY EXECUTE 'SELECT to_json(array_agg(to_json(ARRAY[array_to_json(keys),array_to_json(limiter)]))) FROM ah_py WHERE '+qu+';';

END
$func$ LANGUAGE plpgsql;

Жирным выделил то что не работает и я написал это что бы вы примерно поняли логику функции, т.е. должен входить массив к примеру {1,2,3,4} и потом разбираться запросом qu и добавляться в запрос ответ которого должна вернуть вся эта функция.
Generalproger
Дата: 06.03.2015 19:33:27
Alex Marmuzevich,
В целом это решает проблему, но раз уж использовать функции то решил провести все нужные операции внутри нее включая переборку data = {1,2,3} в формат id = 1 OR id = 2 OR id = 3, и пара вопросов насчет функций - как внедрить переданную информацию в запрос и как использовать два запроса внутри функции, если не сложно то посмотрите мое сообщение выше, там я привел пример того что я пытаюсь сделать
лопата
Дата: 06.03.2015 20:22:36
Generalproger
лопата,

Смотрите, есть выборка из БД к примеру SELECT ARRAY[pole_data,pole_param,pole_special] поле data это массив идентификаторов по которым надо сделать выборку из другой БД, на других форумах сказали что так сделать невозможно силами простого sql и я решил пойти и сделать функцию на это дело, если уже обсуждать функцию то получается вот что:

CREATE OR REPLACE FUNCTION func_a(data text[] = '{}')
RETURNS json AS $func$
BEGIN
константа qu = QUERY EXECUTE 'SELECT array_to_string(data, ' OR id = ');';
RETURN QUERY EXECUTE 'SELECT to_json(array_agg(to_json(ARRAY[array_to_json(keys),array_to_json(limiter)]))) FROM ah_py WHERE '+qu+';';

END
$func$ LANGUAGE plpgsql;

Жирным выделил то что не работает и я написал это что бы вы примерно поняли логику функции, т.е. должен входить массив к примеру {1,2,3,4} и потом разбираться запросом qu и добавляться в запрос ответ которого должна вернуть вся эта функция.

если "другая беде", в которой вы утонули -- постгрес, то нахуа,хуа, простите мой французкий, парсить массив, чтобы в итоге написать эквивалент
WHERE ARRAY[3,6,9] && py.data

или что-то сильно из той же оперы.

еще раз :
без забеганий, и рассказок про страшилки, и кусков своего безумия -- расскажите как стоит задача изначально, а не в вашем деформированном мире.

может быть вы хотите совсем что-то банальное, типа
 WHERE id =ANY (data||ARRAY[1::INT,2,3,4])

но отсюда ж не видно, а у вас в голове -- туман

там, за туманами, вечЬными, пьяными... щас спаю
Generalproger
Дата: 06.03.2015 20:47:51
лопата,

Простите, а что вам не понятно?
Есть таблица ah_py в ней есть колонки
id, param:text[], data:text[], limiter:text[], special:text[], fin:text[]
Я сначала выбираю в формате JSON
SELECT to_json(array_agg(to_json(ARRAY[to_json(id), array_to_json(param), array_to_json(limiter), array_to_json(special), array_to_json(fin)]) ORDER BY id)) FROM ah_py WHERE param[3]=1;

И получаю нечто такое ответом:
[ [1,[...],[...],[...],[...],[]], [2,[...],[...],[...],[...],[]], [3,[...],[...],[...],[...],[]],...]
Но тут еще дополнительно есть массив data в котором хранятся идентификаторы строк которые надо дополнительно засунуть в ответ, например в тот массив который выделен жирным, этих идентификаторов может быть как один, так и десять так что выбирать их оказалось сложновато.

Вообщем хочу реализовать нечто такое:
SELECT to_json(array_agg(to_json(ARRAY[to_json(id), array_to_json(param), array_to_json(limiter), array_to_json(special), array_to_json(fin), myfunc(data)]) ORDER BY id)) FROM ah_py WHERE param[3]=1;

Где функция myfunc вернет допустим [[5, [...]], [37, [...]], [38, [...]],...]

P.S. Написал я конечно про таблицу, а не про другую базу, извиняюсь
лопата
Дата: 06.03.2015 20:59:05
Generalproger,
низачод

ты этта, проспись, а завтра попробуй заново сформулировать