如何声明变量以用于PostgreSQL 8.3查询?
在MS SQL Server中,我可以这样做:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
Run Code Online (Sandbox Code Playgroud)
我如何在PostgreSQL中做同样的事情?根据文档变量被简单地声明为"名称类型;",但这给了我一个语法错误:
myvar INTEGER;
Run Code Online (Sandbox Code Playgroud)
有人能给我一个正确语法的例子吗?
是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)
我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.
我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.
这可能吗?
有没有办法在PostgreSQL查询中定义命名常量?例如:
MY_ID = 5;
SELECT * FROM users WHERE id = MY_ID;
Run Code Online (Sandbox Code Playgroud) 我想在会话/事务中记录用户的id,使用SET
,所以我以后可以在触发器函数中使用它来访问它current_setting
.基本上,我正在尝试从之前发布的非常相似的票证中选择n2 ,区别在于我正在使用PG 10.1.
我一直在尝试3种设置变量的方法:
SET local myvars.user_id = 4
,从而在交易中在本地设置;SET myvars.user_id = 4
从而将其设置在会话中;SELECT set_config('myvars.user_id', '4', false)
,取决于最后一个参数,将是前两个选项的快捷方式.它们都不能在触发器中使用,触发器NULL
在获取变量时接收current_setting
.这是我设计的用于对其进行故障排除的脚本(可以很容易地与postgres docker镜像一起使用):
database=$POSTGRES_DB
user=$POSTGRES_USER
[ -z "$user" ] && user="postgres"
psql -v ON_ERROR_STOP=1 --username "$user" $database <<-EOSQL
DROP TRIGGER IF EXISTS add_transition1 ON houses;
CREATE TABLE IF NOT EXISTS houses (
id SERIAL NOT NULL,
name VARCHAR(80),
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
PRIMARY KEY(id)
);
CREATE …
Run Code Online (Sandbox Code Playgroud) 如果我在psql终端,那么我可以声明并使用这样的变量:
\set message_id soifsdaofisd.gmail.com;
select * from emails where message_id = ':message_id';
Run Code Online (Sandbox Code Playgroud)
我怎么能在pgAdmin中这样做?
我在pgAdmin中尝试这个时出错:
错误:"CALAdkA4YC0"或其附近的语法错误第3行:设置message_id soifsdaofisd.gmail.com.
我正在对PostgreSQL与SQLServer进行比较,以便进行迁移.现在我正在评估T-SQL与PL/pgSQL,事实是在T-SQL中你可以使用循环或声明变量,例如:
declare @counter int
set @counter = 0
while @counter < 10
begin
set @counter = @counter + 1
print 'The counter is ' + cast(@counter as char)
end
Run Code Online (Sandbox Code Playgroud)
没有必要将它放在函数或过程中.我可以在PostgreSQL中做到吗?
在网上搜索我在MySQL中找到了一个否定的答案,但我没有找到Postgres的答案.
我的应用程序使用相同的凭据连接到 PostgreSQL 数据库(数据库提供商要求...)但是我需要识别哪个应用程序用户正在连接到数据库(例如用于更新审核等)
我想知道是否有任何方法可以设置一些变量(其生命仅限于会话),然后我可以通过 DDL 读取该变量。
** 编辑 **
我还做了一些实验,在连接字符串中使用 application_name 并放置简单的用户登录 - 但这不是最优雅的方式......
SET application_name TO 'user_login';
select current_setting('application_name');
Run Code Online (Sandbox Code Playgroud)
知道如何存档吗?
在Microsoft SQL Server中,要在查询窗口中测试类似的内容:
select * from Users where LastName = @lastname
Run Code Online (Sandbox Code Playgroud)
我可以在命令之前添加这个:
declare @lastname varchar(16)
set @lastname = 'Troy'
Run Code Online (Sandbox Code Playgroud)
但是在PostgreSQL中,我找不到类似的方法.似乎我唯一能做的就是直接用它的值替换参数名称.当ad-hoc查询变得复杂并且多次使用相同的参数时,它变得很难.有办法吗?
我想在PostgreSQL SELECT查询中的字符'/'后提取字符串.
字段名称是source_path
,表名是movies_history
.
数据示例:
source_path的值:
等等.source_path的所有值都采用此格式
我只需要获取'file.xxx'字符串.
我还是SQL的新手,所以我有一些小问题需要解决.我在Acqua Data Studio中运行Postgres数据库,其中一些查询遵循相同的模型.
这些查询中的一些变量是相同的,但将来可能会发生变化......
考虑到优化的数据库,更改常量的值比输入20多个查询并更改所有这些查询中的相同方面更快.
例:
SELECT *
FROM Table AS Default_Configs
LEFT JOIN Table AS Test_Configs
ON Default_Configs.Column1 = 'BLABLABLA'
Run Code Online (Sandbox Code Playgroud)
想象'BLABLABLA'可能是'XXX',我怎么能让'BLABLABLA'成为遵循这种模式创建的每个View的常量?