小编Héc*_*tor的帖子

SELECT sql_function(...) 与 SELECT * FROM sql_function(...)

我第一次阅读 PostgreSQL 文档,当面对 SQL 函数时,我认为我已经理解了所有基础知识,但仍然看不出SELECT sql_function(...)SELECT * FROM sql_function(...)以及何时使用其中一个的区别。

postgresql functions

3
推荐指数
1
解决办法
4193
查看次数

区分大小写不一致

我正在尝试学习和理解排序规则以及 postgresql 如何比较和排序字符串,但我发现了一个不协调的地方,我不知道我错过了什么。

查询:

SELECT datname, datcollate FROM pg_database;
Run Code Online (Sandbox Code Playgroud)

返回我的所有数据库都使用 en_GB.UTF-8 排序规则。

和查询:

SELECT table_schema, 
   table_name, 
   column_name,
   collation_name
FROM information_schema.columns
WHERE collation_name is not null
ORDER BY table_schema,
     table_name,
     ordinal_position;
Run Code Online (Sandbox Code Playgroud)

返回所有列都具有“C”排序规则,这意味着(根据我的研究)未指定排序规则。所以,我认为使用了数据库排序规则,不是吗?

编辑:我的错误就在这里。前面的查询不会返回所有列的结果,只会返回那些不collation_name为 null 的列,并且具有 null 排序规则的列是继承 DB 排序规则的列。所以我认为 foo.bar 列有C排序规则,但null事实上确实如此。

好吧,当我运行查询时,不一致的情况出现了:

SELECT "name" FROM foo.bar ORDER BY "name" ASC;
Run Code Online (Sandbox Code Playgroud)

其中“name”列数据类型是文本,foo.bar 是用户创建的 schema.table 组合。结果是像人类一样按字母顺序排列。从a/A到Z/z,无论是大写还是小写。

但是如果我运行以下查询:

SELECT "table_name"
FROM information_schema.tables
WHERE
    "table_name" ~ 'some_pattern'
    AND table_schema = 'foo'
    AND table_type = 'BASE TABLE'
ORDER BY "table_name" …
Run Code Online (Sandbox Code Playgroud)

postgresql collation order-by

3
推荐指数
1
解决办法
114
查看次数

错误:无法从函数执行 CREATE MATERIALIZED VIEW ...WITH DATA

我需要CREATE MATERIALIZED VIEW ... WITH DATA从函数/过程执行,但我得到了ERROR: CREATE MATERIALIZED VIEW ... WITH DATA cannot be executed from a function.

除了使函数返回创建查询文本并复制粘贴以执行它之外,还有其他解决方法吗?

看起来真的很傻,但我想这背后有一个很好的理由......无论如何,这个限制有什么解决方法吗?

我正在运行 postgresql 15。

postgresql stored-procedures materialized-view functions postgresql-15

3
推荐指数
1
解决办法
1429
查看次数