Pg fetch all columns: примеры (PHP)
pg_fetch_all_columns(PgSql\Result $result, int $field = 0): arrayФункция pg_fetch_all_columns извлекает все значения из одного столбца результата PostgreSQL-запроса в виде массива. Эта функция применяется, когда требуется получить данные только одного поля для всех строк результата, например, список идентификаторов, имен или других однотипных значений.
Синтаксис функции: pg_fetch_all_columns(resource $result, int $column = 0): array.
- $result: Обязательный параметр. Ресурс результата запроса, возвращаемый функциями
pg_query(),pg_query_params()илиpg_execute(). - $column: Необязательный параметр. Номер столбца, данные которого требуется извлечь. Нумерация начинается с 0. Значение по умолчанию - 0 (первый столбец).
Функция возвращает массив (array), содержащий все значения указанного столбца для каждой строки результата. Если строк нет, возвращается пустой массив.
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id FROM users ORDER BY id LIMIT 3");
$ids = pg_fetch_all_columns($result);
print_r($ids);Array
(
[0] => 1
[1] => 2
[2] => 3
)$result = pg_query($conn, "SELECT id, name, email FROM users LIMIT 2");
$emails = pg_fetch_all_columns($result, 2); // Получаем третий столбец (email)
print_r($emails);Array
(
[0] => user1@example.com
[1] => user2@example.com
)$result = pg_query($conn, "SELECT name FROM users WHERE 1=0");
$names = pg_fetch_all_columns($result);
var_dump($names);array(0) {
}- pg_fetch_all(): Извлекает все строки результата в виде массива ассоциативных массивов или массивов с числовыми индексами. Удобна для получения полного набора данных всех столбцов.
- pg_fetch_assoc() / pg_fetch_row(): Извлекают одну строку за вызов. Применяются для итеративной обработки больших результатов, чтобы не загружать все данные в память сразу.
- pg_fetch_result(): Получает значение из конкретной строки и столбца. Используется для точечного доступа к данным.
Функцию pg_fetch_all_columns предпочтительнее использовать, когда требуются значения только одного поля из всех строк. Это эффективнее, чем извлечение полных строк с последующим выделением столбца.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT name FROM users")
# Извлечение всех значений одного столбца через list comprehension
names = [row[0] for row in cur.fetchall()]
print(names)['Alice', 'Bob', 'Charlie']
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT email FROM users');
// map для преобразования строк в значения столбца
const emails = res.rows.map(row => row.email);
console.log(emails);В MySQL нет прямой аналогичной функции в API, но можно использовать агрегацию в самом SQL-запросе или обработку результата на стороне клиента аналогично другим языкам.
-- Сам запрос может сразу возвращать плоский список через GROUP_CONCAT, но это не всегда практично
SELECT GROUP_CONCAT(name SEPARATOR ', ') FROM users;$result = pg_query($conn, "SELECT id FROM users");
$data = pg_fetch_all_columns($result, 5); // Столбца с индексом 5 не существует
// Функция вернет пустой массив для несуществующего столбца
var_dump($data);array(0) {
}$fake_result = null;
$data = pg_fetch_all_columns($fake_result);
// Вызовет предупреждение и вернет falseWarning: pg_fetch_all_columns() expects parameter 1 to be resource, null given
// PostgreSQL возвращает BIGINT, PHP может преобразовать его в строку
$result = pg_query($conn, "SELECT bigint_column FROM table");
$values = pg_fetch_all_columns($result);
// Значения могут быть строками, а не целыми числамиФункция pg_fetch_all_columns была добавлена в PHP 5.1.0. С тех пор ее поведение и сигнатура оставались стабильными. В PHP 8.0 усилилась строгая типизация, поэтому передача некорректного типа в параметр $result вызывает TypeError, а не предупреждение, если включен строгий режим.
$result = pg_query_params(
$conn,
"SELECT id FROM users WHERE active = $1 ORDER BY created_at DESC LIMIT 10",
[true]
);
$ids = pg_fetch_all_columns($result);
// Массив последних 10 активных ID$result = pg_query($conn, "
SELECT u.id AS user_id,
CONCAT(u.first_name, ' ', u.last_name) AS full_name
FROM users u
");
$fullNames = pg_fetch_all_columns($result, 1); // Индекс 1 - столбец full_name
print_r($fullNames);// Получение массива целых чисел
$result = pg_query($conn, "SELECT id FROM products");
$ids = pg_fetch_all_columns($result);
// Явное приведение типов, если PostgreSQL драйвер возвращает строки
$ids = array_map('intval', $ids);$result = pg_query($conn, "SELECT json_data->>'tags' AS tags FROM documents");
$tagsJson = pg_fetch_all_columns($result);
$allTags = [];
foreach ($tagsJson as $json) {
if ($json) {
$decoded = json_decode($json, true);
if (is_array($decoded)) {
$allTags = array_merge($allTags, $decoded);
}
}
}
$uniqueTags = array_unique($allTags);// Создание ассоциативного массива id => name
$result = pg_query($conn, "SELECT id, name FROM cities");
$ids = pg_fetch_all_columns($result, 0);
$names = pg_fetch_all_columns($result, 1);
$cityMap = array_combine($ids, $names);
// $cityMap = [1 => 'Москва', 2 => 'Санкт-Петербург', ...]