我第一次阅读 PostgreSQL 文档,当面对 SQL 函数时,我认为我已经理解了所有基础知识,但仍然看不出SELECT sql_function(...)
和SELECT * FROM sql_function(...)
以及何时使用其中一个的区别。
我正在尝试学习和理解排序规则以及 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) 我需要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