我有一张桌子test(id,name)
.
我需要插入样值: user's log
,'my user'
,customer's
.
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
Run Code Online (Sandbox Code Playgroud)
如果我运行上述任何语句,我会收到错误.
如果有任何方法可以正确地做到这一点请分享.我不想要任何准备好的陈述.
是否可以使用sql转义机制?
我试图从表中获取25个15,000个ID的随机样本.而不是每次都手动按下运行,我正在尝试循环.我完全理解的不是Postgres的最佳用法,但它是我的工具.这是我到目前为止:
for i in 1..25 LOOP
insert into playtime.meta_random_sample
select i, ID
from tbl
order by random() limit 15000
end loop
Run Code Online (Sandbox Code Playgroud) 像这样的东西:
CREATE OR REPLACE FUNCTION get(param_id integer)
RETURNS integer AS
$BODY$
BEGIN
SELECT col1 FROM TABLE WHERE id = param_id;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我想避免DECLARE
这样做.
之间有什么区别:
CREATE FUNCTION func() RETURNS integer
LANGUAGE plpgsql AS $$
declare
begin
-- do something
end
$$;
Run Code Online (Sandbox Code Playgroud)
和
CREATE FUNCTION func() RETURNS INTEGER AS $$
declare
begin
-- do something
end
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
LANGUAGE plpgsql
基本上只需要超出使用范围吗$$
?
我使用PostgreSQL 10并且我CREATE EXTENSION unaccent;
成功运行.我有一个包含以下内容的plgsql函数
whereText := 'lower(unaccent(place.name)) LIKE lower(unaccent($1))';
之后,根据用户选择的内容,可以添加更多条款whereText
.
在whereText
最终使用的查询:
placewithkeys := '%'||placename||'%';
RETURN QUERY EXECUTE format('SELECT id, name FROM '||fromText||' WHERE '||whereText)
USING placewithkeys , event, date;
Run Code Online (Sandbox Code Playgroud)
将whereText := 'LOWER(unaccent(place.name)) LIKE LOWER(unaccent($1))';
不起作用,即使我删除LOWER
的部分.
我做的select __my_function('???');
,我什么也没有回来,即使我应该回来的结果,因为在数据库中存在名称?????
如果我删除unaccent
,并留下了LOWER
它的工作原理,但没有口音:??
带来了?????
回来,因为它应该.这似乎unaccent
是导致问题.
我错过了什么?我怎样才能解决这个问题?
由于有关于语法和可能的SQLi的评论,我提供了整个函数定义,现在更改为在希腊语中对重音不敏感和不区分大小写的工作:
CREATE FUNCTION __a_search_place
(placename text, eventtype integer, eventdate integer, eventcentury integer, constructiondate integer, constructioncentury integer, arstyle integer, artype …
Run Code Online (Sandbox Code Playgroud) 我在尝试在触发函数中调试时遇到错误。在 Postgres 日志中,我有以下内容:
2012-08-16 21:41:23 PDT ERROR: Unknown period: D
2012-08-16 21:41:23 PDT CONTEXT: PL/pgSQL function "handle_promotion_update"
line 60 at assignment
SQL statement "UPDATE promotion SET some_column = foo + 1
WHERE id = NEW.promotion_id"
PL/pgSQL function "handle_new_reward" line 94 at SQL statement
Run Code Online (Sandbox Code Playgroud)
所以,看来我的问题可能从“第 60 行”开始
我的问题是行号从哪里开始?如果我进入 pgAdmin 并查看函数声明,它的顶部有“helper”(如删除函数)。所以,我不认为它来自那里。但是,它包含函数声明吗?或者只是从 行开始BEGIN
?
我想创建一个包含变量的脚本,_user
并且仅当此类登录尚不存在时才_pass
在 Postgres 数据库中创建用户。我以为这会起作用,但我不知道问题是什么:
DO
$DO$
DECLARE
_user TEXT := 'myuser';
_pass TEXT := 'user!pass';
BEGIN
IF NOT EXISTS ( SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
RAISE NOTICE 'Creating user % ...',_user;
CREATE USER _user WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD _pass;
RAISE NOTICE 'Created user %',_user;
ELSE
RAISE NOTICE 'User % already exists, not creating it',_user;
END IF;
END
$DO$
Run Code Online (Sandbox Code Playgroud)
如何强制用变量的内容替换变量?
$DO$
还有和之间有什么区别$$
?
我想知道如何做到这一点,因为环顾四周后,我发现所有完成这项看似简单的工作的方法都是漫长而复杂的。在 MySQL 中,我们有
DELIMITER //
...function start
INSERT INTO table VALUES (1);
...function end//
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
当我们想使用存储过程或函数时,这非常有用。如果有的话,我正在 postgreSQL 中寻找与此等效的内容。
提前致谢!
我需要检查表中的列是否具有数字值后跟小数点和小数点后的3个精度.请建议如何在postgre SQL(或)任何其他替代方法中使用正则表达式.
谢谢
快速背景:PostgreSQL 非常新,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问题,但仍然找不到解决方案。
我有这个选择语句,我每周执行一次以返回新值
select distinct id, null as charges
, generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)
Run Code Online (Sandbox Code Playgroud)
我能做些什么来把它变成一个我可以右键单击并每周执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此,它将在没有用户参与的情况下执行并将结果以电子表格的形式发送给用户。不确定最后一部分是否对函数的编写方式很重要。
这是我多次失败的尝试之一:
CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
, chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
, generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE …
Run Code Online (Sandbox Code Playgroud) 我想将 Postgres 中的这段代码转换为更短的代码,以实现相同的效果。我读过有关 upsert 的内容,但我不明白在我的代码上实现它的好方法。我写的很好,但我想找到一种更优雅的方式来编写它。希望这里有人可以帮助我!这是查询:
CREATE OR REPLACE FUNCTION insert_table(
in_guid character varying,
in_x_value character varying,
in_y_value character varying
)
RETURNS TABLE(response boolean) LANGUAGE 'plpgsql'
DECLARE _id integer;
BEGIN
-- guid exists and it's been 10 minutes from created_date:
IF ((SELECT COUNT (*) FROM public.tbl_client_location WHERE guid = in_guid AND created_date < NOW() - INTERVAL '10 MINUTE') > 0) THEN
RETURN QUERY (SELECT FALSE);
-- guid exists but 10 minutes hasen't passed yet:
ELSEIF ((SELECT COUNT (*) FROM public.tbl_client_location WHERE …
Run Code Online (Sandbox Code Playgroud)