我有这样的查询,很好地生成两个给定日期之间的一系列日期:
select date '2004-03-07' + j - i as AllDate
from generate_series(0, extract(doy from date '2004-03-07')::int - 1) as i,
generate_series(0, extract(doy from date '2004-08-16')::int - 1) as j
Run Code Online (Sandbox Code Playgroud)
它在2004-03-07和之间生成162个日期2004-08-16,这就是我想要的.这段代码的问题是,它不会得到正确的答案时,这两个日期都不同年份,例如,当我尝试2007-02-01和2008-04-01.
有更好的解决方案吗?
是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)
我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.
我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.
这可能吗?
这个psql会话片段应该是不言自明的:
psql (9.1.7)
Type "help" for help.
=> CREATE TABLE languages(language VARCHAR NOT NULL);
CREATE TABLE
=> INSERT INTO languages VALUES ('english'),('french'),('turkish');
INSERT 0 3
=> SELECT language, to_tsvector('english', 'hello world') FROM languages;
language| to_tsvector
---------+---------------------
english | 'hello':1 'world':2
french | 'hello':1 'world':2
turkish | 'hello':1 'world':2
(3 rows)
=> SELECT language, to_tsvector(language, 'hello world') FROM languages;
ERROR: function to_tsvector(character varying, unknown) does not exist
LINE 1: select language, to_tsvector(language, 'hello world')...
^
HINT: No function matches the given …Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL 11.2中创建了一个用户定义的函数,如下所示。它基本上将值插入到两个不同的表中:
CREATE OR REPLACE FUNCTION public.insertTest(
IN ID1 integer,
IN Value1 character varying,
IN Value2 character varying,
IN Value3 character varying,
IN Status character varying,
IN Active_Flag integer,
IN Stuff1 smallint,
IN stuff2 smallint)
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
Insert into TableA
(TA_ID,
TA_Value1,
TA_Value2,
TA_Value3,
TA_Value4,
TA_Time,
TA_Flag)
values
(ID1,
Value1,
Value2,
Value3,
Status,
now(),
1);
Insert into TableB
(TA_ID,
TB_ID, Confidence, Sev_Rate,
Last_Update_Time, TB_Flag)
values
(currval('tablea_t_id_seq'), --TableA has an auto-increment field
Active_Flag, Stuff1, Stuff2,
now(), …Run Code Online (Sandbox Code Playgroud) postgresql types casting user-defined-functions postgresql-11
文档的generate_series说这样的说法可能是int或bigint用于generate_series(start, stop)与generate_series(start, stop, step)案件timestamp或timestamp with time zone为generate_series(start, stop, step interval).
generate_series使用date类型作为输入和返回的原因是什么timestamp with timezone?
pg=# select generate_series('2014-01-01'::date,'2014-01-02'::date,'1 day');
generate_series
------------------------
2014-01-01 00:00:00+01
2014-01-02 00:00:00+01
(2 rows)
Run Code Online (Sandbox Code Playgroud) 这个合法(!)CASE构造返回一个 JSON 数据类型:
SELECT CASE WHEN true THEN to_json(1) ELSE to_json('hello') END;
Run Code Online (Sandbox Code Playgroud)
但:
错误:无法确定多态类型,因为输入的类型为“未知”
它不是“多态”,它是 JSON。
...所以,作为糟糕的解决方法(丢失数字/字符串 JSON 表示),
SELECT to_json(CASE WHEN true THEN 1::text ELSE 'hello' END);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来执行 SQL 到 JSON 的转换?
完整的错误信息是:
Run Code Online (Sandbox Code Playgroud)ERROR: invalid input syntax for integer: "1e+06" SQL state: 22P02 Context: In PL/R function sample
我正在使用的查询是:
WITH a as
(
SELECT a.tract_id_alias,
array_agg(a.pgid ORDER BY a.pgid) as pgids,
array_agg(a.sample_weight_geo ORDER BY a.pgid) as block_weights
FROM results_20161109.block_microdata_res_joined a
WHERE a.tract_id_alias in (66772, 66773, 66785, 66802, 66805, 66806, 66813)
AND a.bldg_count_res > 0
GROUP BY a.tract_id_alias
)
SELECT NULL::INTEGER agent_id,
a.tract_id_alias,
b.year,
unnest(shared.sample(a.pgids,
b.n_agents,
1 * b.year,
True,
a.block_weights)
) as pgid
FROM a
LEFT JOIN results_20161109.initial_agent_count_by_tract_res_11 b
ON a.tract_id_alias = …Run Code Online (Sandbox Code Playgroud) postgresql ×7
casting ×4
types ×3
date ×1
function ×1
integer ×1
json ×1
plr ×1
polymorphism ×1
schema ×1
search-path ×1
sql ×1
time-series ×1
timestamp ×1