Начиная с Python 3.6 вы можете использовать f-строки. https://www.python.org/dev/peps/pep-0498/
head = csv.reader(open(f'{sys.argv[1]}.csv'))
.
Я полагаю, что ответ, в котором Вы нуждаетесь, является пользовательским агрегатом, подобным этому:
CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR;
RETURN '';
END FUNCTION;
CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255))
RETURNING LVARCHAR;
IF result = '' THEN
RETURN TRIM(value);
ELSE
RETURN result || ',' || TRIM(value);
END IF;
END FUNCTION;
CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR)
RETURNING LVARCHAR;
IF partial1 IS NULL OR partial1 = '' THEN
RETURN partial2;
ELIF partial2 IS NULL OR partial2 = '' THEN
RETURN partial1;
ELSE
RETURN partial1 || ',' || partial2;
END IF;
END FUNCTION;
CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR;
RETURN final;
END FUNCTION;
CREATE AGGREGATE group_concat
WITH (INIT = gc_init, ITER = gc_iter,
COMBINE = gc_comb, FINAL = gc_fini);
Учитывая таблицу элементов (названный элементами) со столбцом назвал имя, содержащее (странно достаточно) имя элемента и другой столбец названный atomic_number, этот запрос приводит к этому результату:
SELECT group_concat(name) FROM elements WHERE atomic_number < 10;
Hydrogen,Helium,Lithium,Beryllium,Boron,Carbon,Nitrogen,Oxygen,Fluorine
Относившийся вопрос, необходимо получить ответ, от которого Вы нуждаетесь:
SELECT id, group_concat(codes)
FROM anonymous_table
GROUP BY id;
CREATE TEMP TABLE anonymous_table
(
id INTEGER NOT NULL,
codes CHAR(4) NOT NULL,
PRIMARY KEY (id, codes)
);
INSERT INTO anonymous_table VALUES(63592, 'PELL');
INSERT INTO anonymous_table VALUES(58640, 'SUBL');
INSERT INTO anonymous_table VALUES(58640, 'USBL');
INSERT INTO anonymous_table VALUES(73571, 'PELL');
INSERT INTO anonymous_table VALUES(73571, 'USBL');
INSERT INTO anonymous_table VALUES(73571, 'SUBL');
INSERT INTO anonymous_table VALUES(73572, 'USBL');
INSERT INTO anonymous_table VALUES(73572, 'PELL');
INSERT INTO anonymous_table VALUES(73572, 'SUBL');
SELECT id, group_concat(codes)
FROM anonymous_table
GROUP BY id
ORDER BY id;
Вывод от этого:
58640 SUBL,USBL
63592 PELL
73571 PELL,SUBL,USBL
73572 PELL,SUBL,USBL
Дополнительный набор данных был добавлен, чтобы протестировать, вставляют ли последовательность, влиял на результат; это, кажется, не делает так (коды находятся в отсортированном порядке; я не уверен, существует ли способ измениться - реверс - тот порядок).
Примечания:
LVARCHAR(10240)
(для 10 кибибайт), например.SQL -528: Maximum output rowsize (32767) exceeded
, который удивляет меня.Если необходимо удалить агрегат, можно использовать:
DROP AGGREGATE IF EXISTS group_concat;
DROP FUNCTION IF EXISTS gc_fini;
DROP FUNCTION IF EXISTS gc_init;
DROP FUNCTION IF EXISTS gc_iter;
DROP FUNCTION IF EXISTS gc_comb;
Я не уверен в informix sql, но в MSSQL или Oracle, Вы могли сделать это с
ДЕКОДИРУЙТЕ или ключевые слова СЛУЧАЯ путем конкатенации их вместе. Однако это потребовало бы, чтобы Вы знали все потенциальные ценности заранее, который является хрупким.
Я принимаю причину, Вам не нравится ключевое слово МАТЕРИАЛА, то, потому что informix не поддерживает его?
Oracle также поддерживает ПОДКЛЮЧЕНИЕ ключевыми словами, которые работали бы, но снова не могут поддерживаться informix.
Вероятно, лучший ответ должен был бы создать этот вывод в Вашем слое клиента/данных после запроса. Существует ли конкретная причина, почему это должно быть сделано в запросе?
Кроме того, если informix позволяет Вам создавать функции пользователя, Вы могли бы создать функцию, которая возвратила строку со связанным значением.
Я хотел бы указать на Вас, это отвечает на другой подобный вопрос на Переполнении стека. Вы ищете что-то как MySQL group_concat()
функция.