我有两列X和Y一个where语句如下:
WHERE (x=0 or x=1 or x=4 or x=6 or x=7 or x=12 or x=75) and
(y=0 or y=1 or y=4 or y=6 or y=7 or y=12 or y=75)
Run Code Online (Sandbox Code Playgroud)
因为它在同一个表的两列上都是相同的条件,有没有办法缩短它?
有点像x and y are (0 or 1 or 4....)- 它不是PostgreSQL语法,但它澄清了这个问题.
注意:数字代表状态,这种情况背后没有数学逻辑.
在pgAdmin中有两种标记注释的方法 - PostgreSQL:
-- bla bla和:
/* bla bla
bla bla*/对于第一个我使用ctrl + k作为短热键.第二个有热键吗?我知道ctrl + k可以应用于muliple线,如果我标记它们但它会添加 - 对于所有不是我正在寻找的线.
我在PostgreSQL中有这个功能:
CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[])
RETURNS SETOF typ_new AS
$BODY$
declare
begin
CREATE OR REPLACE VIEW newView as (select * from func2($1,$2,$3));
end;
$BODY$
LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)
func2也会返回,SETOF typ_new因此它们兼容.
运行时我收到一个错误:ERROR: there is no parameter $1
如果我更改$1为参数名称,a则错误更改为
ERROR: column "a" does not exist
我也尝试过动态SQL:
sqlstr ='CREATE OR REPLACE VIEW newView (columns... ) as
(select * from func2('||$1||','||$2||','||$3||'))';
execute sqlstr;
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为$3是integer[]和||不能使用数组.
我该如何解决这个问题?
我有一个A包含startdate列的表,TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询/函数来生成从MIN列的值到MAX列的值的月份列表。
例如:
startdate
2014-12-08
2015-06-16
2015-02-17
Run Code Online (Sandbox Code Playgroud)
将生成一个列表:(Dec-14,Jan-15,Feb-15,Mar-15,Apr-15,May-15,Jun-15)
我怎么做?我从未使用 PostgreSQL 生成不存在的数据...它总是在数据库中查找正确的数据...有什么想法如何做到这一点吗?在查询中可行吗?
我有一个查询,它的select语句是这样的:
select Greatest(p.price,0) as newprice, sum(q.qty) as qty
from ....
Run Code Online (Sandbox Code Playgroud)
它给了我:
newprice qty
10 1
0 1
100 2
1 2
Run Code Online (Sandbox Code Playgroud)
我想将newprice与qty相乘得到:
newprice qty result
10 1 10
0 1 0
100 2 200
1 2 2
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做select Greatest(p.price,0) as newprice, sum(q.qty) as qty, newprice * qty时说
ERROR: column "newprice" does not exist
Run Code Online (Sandbox Code Playgroud)
我真的不需要这个额外的专栏.
我真正想要的是:SUM(Greatest(p.price,0) * SUM(q.qty)) 它应该给出价值,212但它说ERROR: aggregate function calls cannot be nested
基本上我只需要将两列相乘并对结果求和.我知道我可以使用类似于此处所示的CTE ,但我想知道是否有更简单的方法来减少代码.
我有一个名为seque_post的序列.
我需要找出它正在使用的表格.有没有办法编写一个会给出表名的查询?
我写了这个查询来查找序列:
select *
from pg_class
where relname like 'seque_post'
Run Code Online (Sandbox Code Playgroud)
那里有一个reltoastrelid根据手册给出的文件:
与此表关联的TOAST表的OID,如果没有,则为0.TOAST表在辅助表中存储"脱节"的大型属性.
但我不知道如何从这里继续..建议?
我的表中有一个Boolean类型字段(PostgreSQL 9.0)
有没有办法编写一个查询,在不知道当前存在什么的情况下将该字段更新为相反的值?
如果是,True那么它将更新为False.
如果是,False那么它将更新为True.
基本上我问是否有一种机制允许将Boolean类型与1 bit. 例如,在 C 中,如果x可以是,{1,0}您可以简单地编写x=!x,如果是,0则将是1,如果是1,则将是0。无需IF声明等...
我有一个表名 student 并且我的数据库中有 35 个模式。我怎样才能得到表学生存在的模式?(在不同的模式中可能有多个)。
我已经尝试过了,pg_class但我不知道如何从那里获取架构名称。
我有一个字段,其格式是日期与时间:YYYY-MM-DD HH-MM-SS例如:2000-08-12 00:00:00我想获得日期部分并更改其格式DD/MMM/YYYY,例如前一个示例的预期结果将是:12/Aug/2000
字段定义是: Ddate timestamp without time zone DEFAULT now()
我也阅读了日期/时间函数和操作符以及其他来源的整个页面,但我找不到任何有用的信息.
关注此主题一行if-condition-assignment
有没有办法缩短那里的建议陈述:
num1 = (20 if intvalue else 10)
Run Code Online (Sandbox Code Playgroud)
如果指定值在条件中是相同的值?
这就是它现在的样子:
num1 = (intvalue if intvalue else 10)
Run Code Online (Sandbox Code Playgroud)
intvalue出现两次.有没有办法只使用intvalue一次并获得相同的声明?更优雅的东西?
在PostgreSQL手册中,它说它citext只是一个TEXT通过调用实现数据类型的模块LOWER():
citext模块提供不区分大小写的字符串类型citext.从本质上讲,它在比较值时内部调用较低.否则,它的行为几乎与文本完全相同.
另一方面,在文件结束时,它说:
citext不如文本有效,因为运算符函数和B树比较函数必须复制数据并将其转换为小写以进行比较.但是,使用lower来获得不区分大小写的匹配稍微有效一点.
所以我很困惑,如果它使用它LOWER()怎么能"比使用更低的效率略高"?