我一直试图在postgres中循环一个对象数组.但是,我反复收到错误error: could not determine polymorphic type because input has type "unknown".我认为这与我传递给看起来像这样的函数的值有关.
[
{
"number": 1,
"letter": "a"
},
{
"number": 2,
"letter": "b"
}
]
Run Code Online (Sandbox Code Playgroud)
功能如下.我已经制作了类型ANYARRAY,我认为它应该完全按照名称暗示.我不介意有更具体的选择.
CREATE OR REPLACE FUNCTION "CheckArrayOfObjects" (
"@arrayOfObjects" ANYARRAY
)
RETURNS void AS
$func$
DECLARE "e" JSONB;
BEGIN
FOR "e" IN json_array_elements("@arrayOfObjects")
LOOP
RAISE NOTICE 'Checking Item %', "e";
END LOOP;
END;
$func$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
我也尝试过FOREACH,但它并没有更好.我认为问题在于传入的值,所以不确定修改循环是否会做任何事情.
我使用 Psycopg2 将数据插入到 Postgres 数据库中:
params = "ts, price, volume"
entry = (1234567, None, 3)
cur.execute(f"INSERT INTO stock_data ({params}) VALUES {entry};")
Run Code Online (Sandbox Code Playgroud)
我无数次使用这种带有参数和元组条目的 f-string 模式,没有任何问题。
有关其他信息,该price列没有任何约束,并且是numeric(5).
对于这个特定的例子,它给了我错误:
psycopg2.ProgrammingError: column "none" does not exist
我尝试的一切都导致了这个错误。最终起作用的不是使用 f 弦。以下条目有效:
cur.execute(f"INSERT INTO stock_data ({params}) VALUES (%s, %s, %s);", entry)
我的理解是这些是相同的。为什么后者会起作用,但将条目直接包含在INSERT语句中不起作用?
在 MySQL 中,您可以使用 ELT() 函数从列表中的指定位置返回一个项目。
如何在 Postgresql 中找到相同的
--- 在 MYSQL
SELECT ELT(3, 'Cat', 'Dog', 'Horse') AS 'Result';
Run Code Online (Sandbox Code Playgroud)
- - 结果 - - - - -
Horse
Run Code Online (Sandbox Code Playgroud) 我有一张桌子
Visitor: (id, signup_up, sessions, email, custom_fields)
custom_fields表单的JSON对象的jsonb数组在哪里
CustomField: ( field, value ) 例: (domain, www.somedomain.com)
我想获取signed_up, sessions, email列和它们的值,以及数组中的CustomFieldjson对象custom_fields,并将它们合并到data使用相同CustomField结构调用的第3个字段中,即.每个条目都有表格field: value.
例
鉴于这些行
id | sessions | email | custom_fields
---------------------------------------------------------------
1 | 3 | test@gmail.com [{ field: domain, value: "www.hello.com" }, { field: type, value: "Customer" }]
---------------------------------------------------------------
2 | 5 | another@gmail.com [{ field: domain, value: "www.other.com" }, { field: type, value: "Customer" }]
Run Code Online (Sandbox Code Playgroud)
我想得到
id …Run Code Online (Sandbox Code Playgroud) 我在使用Postgresql将记录数组转换为JSON时遇到问题。
版本: psql(PostgreSQL)9.5.3
当前查询:
SELECT c.id, (select array(
select (cp.id,cp.position)
from contactposition cp
where cp.contact_id_id = c.id -- join on the two tables
)
) as contactpositions
from contacts c;
Run Code Online (Sandbox Code Playgroud)
表中的联系人contacts可以从表中分配许多职位contactposition。
结果是这样的:
| id (integer) | contactpositions (record[]) |
|--------------|----------------------------------------------------------------------|
| 5 | {"(21171326,\"Software Developer\")","(21171325,Contractor)" (...)"} |
Run Code Online (Sandbox Code Playgroud)
但是我希望它是这样的:
| id (integer) | contactpositions (record[]) |
|--------------|----------------------------------------------------------------------|
| 5 | [{"id": 21171326, "position": "Software Developer", "id": 21171325, "position": "Contractor", (...)] |
Run Code Online (Sandbox Code Playgroud)
我知道一些辅助功能,例如array_to_json,但是我无法使其正常工作。
我试过了:
SELECT c.id, …Run Code Online (Sandbox Code Playgroud) 我想为插入操作创建触发器,以及打印插入值的过程。
CREATE TRIGGER added_product_info_trigger
BEFORE INSERT
ON products
EXECUTE PROCEDURE added_product_info();
Run Code Online (Sandbox Code Playgroud)
还有我的程序
CREATE OR REPLACE FUNCTION added_product_info()
RETURNS trigger
AS
$$
(Select p.productname, s.companyname from products as p, suppliers as s
where p.supplierid = s.supplierid)
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
如何打印我插入的值?
理想情况下,我想运行一个查询,返回一个表,其中每一行都是指定表的列名,并且jsonb表中与该列对应的所有不同值的数组。
棘手的部分似乎是动态执行的,我可以只指定表而不是每个单独的列。
我可以从 中检索相关表的所有列名information_schema.columns,但是有没有一种简单的方法可以将其与查询结合起来以检索每列的所有不同值?
我需要在数据库(PostgreSQL 9.3.5)的许多表上运行相同的查询,并将表名作为参数传递给函数似乎是一件逻辑的事情。通过阅读文档中的示例和众多SO帖子,我仍然无法确定。
使用以下最小示例:
CREATE TABLE films (
code char(5),
kind varchar(10)
);
INSERT INTO films VALUES
('UA502', 'Comedy');
Run Code Online (Sandbox Code Playgroud)
而这个功能:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS void AS -- I know, void is not what I am after
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
以下查询捕获了一些内容:
mydb=> SELECT foo('films');
foo
-----
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是,因为我要检索表,所以我编辑第二行并重新创建该函数,如下所示:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS TABLE(count integer) AS
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE …Run Code Online (Sandbox Code Playgroud) 我有一个名为cust_data的表,它存储id和JSON对象.我想编写postgres select语句来获取:
表:cust_data
id(numeric) | connections (jsonb)
------------------------------
1, {"Persons": [
{
"personName": "Tom",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Harry",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Lisa",
"gender": "Female",
"country": "Mexico",
"status":"single"
}
]
}
2,{
"Persons": [
{
"personName": "Lisa",
"gender": "Male",
"country": "UK",
"status":"single"
},
{
"personName": "Harry",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Lisa",
"gender": "Female",
"country": "Mexico",
"status":"married"
}
]
}
3,{
"Persons": [
{
"personName": "Lisa", …Run Code Online (Sandbox Code Playgroud) 假设我有一个表results,其中包含一score列,该列是一个充满分数的数组:
CREATE TABLE results (
id serial PRIMARY KEY,
scores numeric[]
);
Run Code Online (Sandbox Code Playgroud)
我想更新表格,以便将每个分数四舍五入到小数点后 4 位。
我创建了一个round_numeric_array适用于单个数组值的舍入函数:
CREATE OR REPLACE FUNCTION round_numeric_array (numeric[]) RETURNS numeric[]
LANGUAGE SQL
AS $$
SELECT array_agg(round(unnest($1), 4))
$$;
Run Code Online (Sandbox Code Playgroud)
但如何将其应用于表中的每个值呢?我一直在努力
UPDATE results SET scores = round_numeric_array(scores)
Run Code Online (Sandbox Code Playgroud)
但我得到一个set-valued function called in context that cannot accept a set错误。有任何想法吗?
我已经读过一些有关“语法错误在或附近”的问答,但是没有一个可以解决我的问题。
错误示例:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
psycopg2.ProgrammingError: syntax error at or near "UPDATE"
LINE 1: DECLARE "teste" CURSOR WITHOUT HOLD FOR UPDATE applicant SET...
^
Run Code Online (Sandbox Code Playgroud)
请注意^右侧的UPDATE。我已经测试了更新脚本,pgadmin 4并且一切正常。
该脚本非常简单:
UPDATE applicant
SET cv_recrutai_entities = %s
WHERE id = %s
Run Code Online (Sandbox Code Playgroud)
我的代码基本上是:
def _connect_database():
return psy.connect(
dbname=settings.DATABASE['DBNAME'],
host=settings.DATABASE['HOST'],
port=settings.DATABASE['PORT'],
user=settings.DATABASE['USER'],
password=settings.DATABASE['PASSWORD'],
application_name=settings.env
)
# Connects to database
conn = _connect_database()
# Creats a named cursor
cur = conn.cursor('test')
# Execute …Run Code Online (Sandbox Code Playgroud) postgresql ×11
json ×5
jsonb ×5
sql ×5
arrays ×3
plpgsql ×3
python ×3
psycopg2 ×2
mysql ×1
python-3.x ×1
sql-update ×1
triggers ×1