2015-05-05 2 views
1

Возможно ли это? В принципе, мы собираемся использовать скрипт для извлечения информации из нашей базы данных. Мы пытаемся создать запрос, который мог бы использовать список значений в текстовом файле в предложении WHERE для ограничения конкретных записей. Этот список будет регулярно изменяться, и это не будет эффективным для ручного редактирования запроса на регулярной основе. Я посмотрел на this question для SQL Server, и я хочу сделать что-то подобное в PostgreSQL.Использование текстового файла в предложении where запроса postgreSQL

Так, например, супер простой запрос может быть что-то вроде

SELECT * 
FROM users 
WHERE userID in "C:\myfile.txt"; 
+3

Нет, это невозможно. Сначала вам нужно импортировать файл в (временную) таблицу. Альтернативой является определение внешней оболочки данных, которая позволяет вам обращаться к файлу в виде таблицы (но тогда файл должен находиться на ** сервере **, где работает Postgres). –

ответ

1

Вы можете определенно сделать это изначально. Если вы идете по этому маршруту, я бы использовал функцию Postgres COPY вместе с временной таблицей в вашем запросе, отменив временную таблицу, когда закончите. Если я не ошибаюсь, это потребует, чтобы ваш файл присутствовал в папке, в которой находится Postgres, например, папке с данными, где бы вы ни устанавливали Postgres.

Однако, для более чистого вида, я бы предпочел использовать PL/R для чего-то вроде этого. Вы можете быстро прочитать из файла и вернуть массив значений, которые будут использоваться в вашем запросе. Я уверен, что вы можете заменить PL/R PL/PYTHON или другим, что вы предпочитаете, имея методы доступа к внешним файлам.

CREATE FUNCTION file_vals() 
    RETURNS integer[] AS 
    $BODY$ 
    return (readLines('C:/path/to/your/file.txt')) 
    $BODY$ 
    LANGUAGE plr IMMUTABLE; 

Ваш file.txt выглядит следующим образом:

555 
123 
567 

Затем вызовите из вашей функции (я ставлю выборочные данные в подзапроса для упрощения):

WITH users AS(
    SELECT 123 AS userID 
) 
SELECT userID 
FROM users 
WHERE userID = ANY(file_vals()) 

Edit: Как указано DanielVérité в комментариях важно отметить, что это работает только в том случае, если у вас есть права администратора по вашей базе данных. PL/R и любое другое языковое расширение, которое дает вам внешний доступ к файлам, по своей сути является ненадежным языком, а это означает, что только администраторы могут создавать функции на этих языках.

Также важно отметить, что файл, который вы читаете, должен быть доступен непосредственно с сервера Postgres. Если вы выполняете эти запросы через удаленный клиент, вам нужно сначала передать этот файл на сервер.

+0

Для этого вы должны быть суперпользователем. Поскольку вы упоминаете [plpython] (http://www.postgresql.org/docs/current/static/plpython.html), см. Мелкий шрифт внизу: _PL/Python доступен только как «ненадежный» язык. . Только суперпользователи могут создавать функции на ненадежных языках, таких как plpythonu._ Нет надежных языков, которые могут работать в файловой системе. –

+1

@ DanielVérité Согласен. PL/R то же самое. ОП не указывала никаких требований безопасности, поэтому я не принимал это во внимание с моим ответом. – Shawn

+0

Я согласен с Шон здесь. Но я также думаю, что информация, предоставленная Даниэлем, должна быть добавлена ​​в ответ. +1 в любом случае, хороший ответ. –

Смежные вопросы