我有一个存储了很多网页的数据库.
我将需要处理我拥有的所有数据,因此我有两个选择:将数据恢复到程序或直接在数据库中处理我将创建的一些函数.
我想知道的是:
我尝试将内容检索到应用程序(工作),但是要慢和脏.我当务之急是在数据库中无法做我在Java中可以做什么,但我不知道这是否属实.
只是一个例子:我有一张叫做的桌子Token.目前,它有180,000行,但这将增加到超过1000万行.我需要做一些处理来知道被归类为"专有名称"的两个令牌之间的单词是否是名称的一部分.
我需要处理所有数据.在这种情况下,直接在数据库上执行比检索应用程序更好吗?
我遇到过这个"voodoo"SQL,它用于从表中执行自定义数据分组.我想知道它是如何做到的,但是我无法理解它.一位SQL专家可以用简单的英语向那些不太熟悉SQL的人解释这个片段的各个部分,它可以让它发挥其魔力吗?
select ceil(rnk/10.0) as grp,
col1, col2, col3, col4, col5, col6, col7
from (select e.col1, e.col2, e.col3, e.col4, e.col5, e.col6, e.col7,
(select count(*)
from mytable d
where e.col1 > d.col1)+1 as rnk
from mytable e) x
order by grp;
Run Code Online (Sandbox Code Playgroud)
上面我无法理解的SQL部分是返回列'x'的内部SQL:
(select count(*) from mytable d
where e.col1 > d.col1)+1 as rnk
from mytable e
) x
Run Code Online (Sandbox Code Playgroud)
我希望能够自己运行该查询:
select count(*) from mytable d
where e.col1 > d.col1)+1 as rnk
from mytable e
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我收到错误:
错误:语法错误在"+"处或附近第2行:其中e.col1> d.col1)+1为rnk
那么,那里发生了什么?!
此外,当前的SQL使用数字10进行硬编码.我想在其周围包装一个函数,以便能够使用10以外的数字调用该函数.
后端数据库是PostgreSQL,因此该函数将在PL/pgSQL中.这是我第一次尝试编写这样的函数 - 但是,这不太正确,因为我想返回指定列的多行 - …
基本上我有一个表messages,其中user_id包含标识创建消息的用户的字段.
当我在两个用户之间显示一个对话(一组消息)时,我希望能够user_id按照一种棘手的方式对消息进行分组:
假设有一些消息(排序依据created_at desc):
id: 1, user_id: 1
id: 2, user_id: 1
id: 3, user_id: 2
id: 4, user_id: 2
id: 5, user_id: 1
Run Code Online (Sandbox Code Playgroud)
我希望按以下顺序获得3个消息组:
[1,2], [3,4], [5]
它应该按*user_id*分组,直到它看到另一个,然后按那个分组.
我正在使用PostgreSQL,并乐意使用特定的东西,无论什么能带来最佳性能.
我在postgres中使用plsql函数循环遍历大型数据集,并使用每个记录中的数据生成字符串.出于某种原因,我得到了不必要的额外双引号,如下所示:
'{ ""id"": ""1""}'
Run Code Online (Sandbox Code Playgroud)
它应该看起来像
'{ "id": "1"}'
Run Code Online (Sandbox Code Playgroud)
另外,我注意到字符串开头和结尾有不需要的括号.我正在使用的代码如下:
CREATE FUNCTION gen_blocks()
RETURNS TEXT AS $$ DECLARE
output TEXT := '';
j record; BEGIN
FOR j IN SELECT '{ "id": "' || id ||'"},' LOOP
output := output || j;
END LOOP;
return output; END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个函数需要从多个表返回结果.这可以在Postgresql中实现吗(9.1现在,计划很快迁移到9.2)?如果是这样,怎么样.
例如
create or replace function f1()
returns ???
as $body$ begin
return query select x.*
from users x;
return query select x.*
from user_preferences x join users y using(user_id) ; -- more where clauses
return query select x.*
from user_permissions x join users y using(user_id) ; -- more clauses
end; $body$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我考虑的替代方案是:(a)做一个用户和user_preferences(等)的笛卡尔积,但这将导致一个巨大的结果表和一个真正复杂的代码.(b)首先对用户进行选择,然后迭代用户列表并根据其属性进行额外的迭代,但这将导致太多的数据库调用.而且,为什么我要编写SQL非常擅长的代码?
是否有一种简洁的方法可以从pg函数中获取多个结果集?我搜索了postgresql文档但找不到任何指导.
非常感谢.
我想通过在单个参数上传递多个值来调用函数,如下所示:
SELECT * FROM jobTitle('270,378');
Run Code Online (Sandbox Code Playgroud)
这是我的功能。
CREATE OR REPLACE FUNCTION test(int)
RETURNS TABLE (job_id int, job_reference int, job_job_title text
, job_status text) AS
$$
BEGIN
RETURN QUERY
select jobs.id,jobs.reference, jobs.job_title,
ltrim(substring(jobs.status,3,char_length(jobs.status))) as status
FROM jobs ,company c
WHERE jobs."DeleteFlag" = '0'
and c.id= jobs.id and c.DeleteFlag = '0' and c.active = '1'
and (jobs.id = $1 or -1 = $1)
order by jobs.job_title;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
有人可以提供语法帮助吗?甚至提供示例代码?
我有一个光标,它指向一个SELECT,但这个选择是动态生成的.我想在声明后分配声明.我做了一个工作的例子,另一个例子不工作.这是仅打印一些数据的简单示例.这是表:
CREATE TABLE public.my_columns (
id serial NOT NULL,
"name" varchar(30) NOT NULL,
/* Keys */
CONSTRAINT my_columns_pkey
PRIMARY KEY (id)
) WITH (
OIDS = FALSE
);
CREATE INDEX my_columns_index01
ON public.my_columns
("name");
INSERT INTO public.my_columns
("name")
VALUES
('name1'),
('name2'),
('name3'),
('name4'),
('name5'),
('name6');
Run Code Online (Sandbox Code Playgroud)
这是函数(我已经把工作代码和代码不起作用):
CREATE OR REPLACE FUNCTION public.dynamic_table
(
)
RETURNS text AS $$
DECLARE
v_sql_dynamic varchar;
--NOT WORKING:
--db_c CURSOR IS (v_sql_dynamic::varchar);
--WORKING:
db_c CURSOR IS (SELECT id, name from public.my_columns);
db_rec RECORD;
BEGIN
v_sql_dynamic := …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PL \ pgSQL过程语言创建两个几何数据类型的函数,例如多点和多行字符串。我想为所有点选择30米距离内的所有线。这是我尝试过的:
Create OR Replace Function get_streets(bar.geom geometry foo.geom geometry)
Returns geometry AS $$
BEGIN
IF ST_DWithin(bar.geom, foo.geom, 30.0) Then
Return foo.geom;
ELSE
Return null;
END IF
Return foo.geom;
END;
$$ Language plpgsql;
Run Code Online (Sandbox Code Playgroud)
由于几何数据类型,该函数返回错误。在plpgsql函数中使用/处理几何数据有什么建议吗?
编辑
看来我的问题是当这个select语句返回null时(我正在尝试处理的情况 - 当它返回null时,我希望我的新值为-999).如果在找到null时出错,我怎么能这样做呢?
原版的
我已经阅读了有关此错误的所有其他SO帖子,但其中没有一个似乎解决了我的问题的根源.
错误非常简单 - 我的EXECUTE语句中的一个参数为null.大.但是,我在调用之前打印出构成我的EXECUTE语句的每个值,并且我可以清楚地看到没有值为null.
码:
CREATE FUNCTION inform_icrm_prob_flow_query(tablename text, location_id int,
product_date_str text, lead_time_start int,
lead_time_end int, first_member_id int,
last_member_id int, dest_file text)
RETURNS void AS $$
DECLARE
count int;
product_date TIMESTAMPTZ;
interval_lead_time_start text;
interval_lead_time_end text;
curr_value double precision;
query text;
BEGIN
product_date := product_date_str::TIMESTAMPTZ;
count := first_member_id;
curr_value := 0;
interval_lead_time_start := ''''|| product_date ||'''::timestamptz +
interval '''||lead_time_start||' hours''';
interval_lead_time_end := ''''|| product_date ||'''::timestamptz +
interval '''||lead_time_end||' hours'' -
interval ''6 hours''';
--create our …Run Code Online (Sandbox Code Playgroud) 所以我有这两个表:
Table user
columns: id,name,surname, password,token,earnedmoney
Table addlisting
columns: id, user_fk,price,date_added
Run Code Online (Sandbox Code Playgroud)
这是我的问题:我想创建一个触发器,以便当我从表addlisting中删除列表时,列表的价格被添加到表用户中的“ earnedmoney”列中。
有人可以帮我吗?谢谢!