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) естественно не прокатывает))))
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. Написал я конечно про таблицу, а не про другую базу, извиняюсь