在Postgres sql语句中检查value是null还是空字符串的最佳方法是什么?
值可以是长表达式,因此最好只检查一次.
目前我正在使用:
coalesce( trim(stringexpression),'')=''
Run Code Online (Sandbox Code Playgroud)
但它看起来有点难看.
stringexpression可以是char(n)包含char(n)具有尾随空格的列的列或表达式.
最好的方法是什么?
我有两个字符串列a和b一个表foo.
select a, b from foo返回值a和b.但是,串联a和b不起作用.我试过了 :
select a || b from foo
Run Code Online (Sandbox Code Playgroud)
和
select a||', '||b from foo
Run Code Online (Sandbox Code Playgroud)
从评论更新:两列都是类型character(2).
CREATE TABLE my_app.person
(
person_id smallserial NOT NULL,
first_name character varying(50),
last_name character varying(50),
full_name character varying(100) generated always as (concat(first_name, ' ', last_name)) STORED,
birth_date date,
created_timestamp timestamp default current_timestamp,
PRIMARY KEY (person_id)
);
Run Code Online (Sandbox Code Playgroud)
Error: generation expression is not immutable
The goal is to populate the first name and last into the full name column.
sql postgresql database-design string-concatenation calculated-columns
我希望PostegreSQL能够放松一下.每次我想要更改视图中使用的列时,似乎我必须删除视图,更改字段然后重新创建视图.我是否可以放弃额外的保护并告诉PostgreSQL让我更改字段然后找出对视图的调整?
澄清: 我理解一个观点是什么.事实上,这是因为视图就像一个子查询,我希望我可以更改基础表并让视图获取更改.
假设我有以下内容:
CREATE TABLE monkey
(
"name" character varying(50) NOT NULL,
)
CREATE OR REPLACE VIEW monkey_names AS
SELECT name
FROM monkey
Run Code Online (Sandbox Code Playgroud)
我真的只想在迁移脚本中执行以下操作,而不必删除并重新创建视图.
ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL
Run Code Online (Sandbox Code Playgroud) 除星期日和公众假期外,工作时间为上午10:00至晚上21:00.
他们的工作每隔15分钟保留一次.工作时间为15分钟至4小时.整个工作必须适合单日.
如何找到Postgres 9.3中从当前日期和时间开始未在指定时间内保留的第一个最近的免费开始时间?
例如,Mary已于12:30至16:00预订,John已于12:00至13:00预订
Reservat表包含预留,yksus2表包含工作,pyha表包含公共假期.表结构如下.如果这有帮助,可以改变储存结构.
查询最长的开始时间为1.5小时,应该返回
John 2014-10-28 10:00
Mary 2014-10-28 10:00
John 2014-10-28 10:15
Mary 2014-10-28 10:15
John 2014-10-28 10:30
Mary 2014-10-28 10:30
Mary 2014-10-28 11:00
John 2014-10-28 13:00
Mary 2014-10-28 16:00
Mary 2014-10-28 16:15
Mary 2014-10-28 16:30
... etc and also starting from next days
Run Code Online (Sandbox Code Playgroud)
我尝试了基于如何从PostgreSql中的预约返回工作时间的答案的查询?下面但它返回错误的结果:
MARY 2014-10-28 13:00:00
MARY 2014-10-29 22:34:40.850255
JOHN 2014-10-30 22:34:40.850255
MARY 2014-10-31 22:34:40.850255
MARY 2014-11-03 22:34:40.850255
Run Code Online (Sandbox Code Playgroud)
此外,还不会返回10:00,10:30等滑动开始时间.
如何获得适当的首次预订?
返回错误结果的查询是:
insert into reservat (objekt2, during) values
('MARY', '[2014-10-28 11:30:00,2014-10-28 …Run Code Online (Sandbox Code Playgroud) 为了优化复杂的 PostgreSQL 查询,我尝试创建一个包含标量字符串和数组并支持数组操作 ( @>,<@和&&)的索引。
但BTREE到目前为止我只设法创建了一个索引:
CREATE INDEX idx1
ON "MyTable"
USING btree
("Char_1", "Array_1", "Array_2", "Array_3", "Char_2");
Run Code Online (Sandbox Code Playgroud)
不支持数组操作(@>,<@和&&)。
我尝试使用GINand GiST(使用btree_ginandbtree_gist扩展),但我发现无法在同一索引中同时使用标量列和数组列。
看起来GIN不支持标量:
ERROR: data type character has no default operator class for access method "gin"
HINT: You must specify an operator class for the index or define a default operator class for the data type.
Run Code Online (Sandbox Code Playgroud)
whileGiST不支持数组: …
我有一个表date和time字段.我很难理解我是如何处理这个问题的,部分是因为我不明白时间如何转换为数字.我使用以下命令创建了一个表:
CREATE TABLE tracking.time_record
(
date date,
"time" time without time zone,
id character(100)
)
Run Code Online (Sandbox Code Playgroud)
我的数据示例如下:
"2012-04-18" | "18:33:19.612" | "2342342384"
Run Code Online (Sandbox Code Playgroud)
例如,如何运行查询以便我可以检查在某一天id具有时间值的所有值> 10 pm?
我意识到,因为我的时间存储在一个字符类型变量中,所以这样的东西不起作用:
SELECT * FROM tracking.time_record
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"
Run Code Online (Sandbox Code Playgroud)
(这是我对时间/日期跟踪的第一次探索 - 我应该选择不同的列名)
我正在将我的 MySQL 数据库迁移到 PostgreSQL 并有一个简单的问题:PostgreSQL 中
最好的等价物是varchar(30)什么?是text吗?
我不确定该CREATE FUNCTION语句在 PostgreSQL 中如何工作。我想定义一个函数(仅用于娱乐),以便给定数字 n,它打印从 1 到 n 的星号所以我写了这个:
CREATE FUNCTION asterisks(n int)
RETURNS CHAR AS
BEGIN
for i in range(1,n+1):
print("*"*i + "\n")
END
LANGUAGE python
Run Code Online (Sandbox Code Playgroud)
我想要的结果n=3:
*
**
***
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这样调用 Python 是否可行。我在这里读到 Postgres 支持 Python 作为过程语言:
我有一个 PostgreSQL 9.3 数据库,其中有一个用户表,该表以保留大小写的格式存储用户名。所有查询都不区分大小写,因此我应该有一个支持它的索引。此外,无论大小写,用户名都必须是唯一的。
这就是我想出的:
forum=> \d users
Table "public.users"
Column | Type | Modifiers
------------+--------------------------+------------------------
name | character varying(24) | not null
Indexes:
"users_lower_idx" UNIQUE, btree (lower(name::text))
Run Code Online (Sandbox Code Playgroud)
用标准 SQL 语法表示:
CREATE TABLE users (
name varchar(24) NOT NULL
);
CREATE UNIQUE INDEX "users_lower_idx" ON users (lower(name));
Run Code Online (Sandbox Code Playgroud)
通过这个模式,我已经满足了所有的约束,尽管没有主键。SQL 标准不支持功能主键,因此我无法提升索引:
forum=> ALTER TABLE users ADD PRIMARY KEY USING INDEX users_lower_idx;
ERROR: index "users_lower_idx" contains expressions
LINE 1: ALTER TABLE users ADD PRIMARY KEY USING INDEX users_lower_id...
^
DETAIL: Cannot create a …Run Code Online (Sandbox Code Playgroud)