gpt4 book ai didi

postgresql - 带换行符的列名

转载 作者:行者123 更新时间:2023-11-29 11:28:53 35 4
gpt4 key购买 nike

我知道对于 PostgreSQL 中的文本字符串,换行符是通过在文本前面附加符号 Ee 来统一的:

SELECT E'first\nsecond'

结果:

first
second

但 PostgreSQL 也支持在列名中换行 - 不确定这种做法为什么或有多邪恶,但可以执行以下操作:

CREATE TABLE One("first\nsecond" text);
CREATE TABLE Two("first
second" text);

当您不幸遇到其中之一时,您会发现虽然这些查询有效:

SELECT "first\nsecond" from One;
SELECT "first
second" from Two;

这些不会:

SELECT "first
second" from One;
SELECT "first\nsecond" from Two;

我的问题是:在 PostgreSQL 中有没有一种方法可以统一这些差异,类似于列值的情况?

我试过将 E 放在 "first\nsecond" 列名前面,但不支持。尝试使用 \r\n 代替(我使用的是 Windows)给了我第三种类型的列名,一种只能查询为:

SELECT "first\r\nsecond" FROM Third

最佳答案

列名是标识符,标识符语法的详细信息在:

http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

TL;DR:使用 U&"..." 语法通过它们的 Unicode 代码点将不可打印字符注入(inject)到标识符中,并且没有办法统一 CR,LFLF 单独。

如何在一行中引用列

我们被允许在标识符中使用 Unicode 转义序列,因此根据文档,以下内容确实有效:

select U&"first\000asecond" from Two;

如果只是两个单词之间的换行符

第一个表上的查询发生了什么

创建表时使用:

CREATE TABLE One("first\nsecond" text);

由于反斜杠字符在这里没有特殊含义,因此该列不包含任何换行符。它包含 first,然后是 \,然后是 n,然后是 second。所以:

 SELECT "first\nsecond" from One;

之所以有效,是因为它与 CREATE TABLE

中的内容相同

鉴于

SELECT "first
second" from One;

失败是因为在该 SELECT 中有一个换行符,其中表中的实际列名有一个反斜杠后跟一个 n

第二张表的查询发生了什么

这是“一”的反义词。

CREATE TABLE Two("first
second" text);

换行符是逐字记录的,是列的一部分。所以

SELECT "first
second" from Two;

之所以有效,是因为换行符与 CREATE TABLE 中的完全一样,带有嵌入式换行符,而

SELECT "first\nsecond" from Two;

失败,因为如前所述,此上下文中的 \n 并不意味着换行符。

回车后跟换行符,或任何更奇怪的东西

如评论和您的编辑中所述,这可能是回车符和换行符,在这种情况下应该执行以下操作:

select U&"first\000d\000asecond" from Two;

尽管在我的测试中,在 Unix 和 Windows 上使用 psql 的列中间按 Enter 具有相同的效果:列名称中的单个换行符。

要检查列名中的确切字符,我们可以检查它们的十六进制。

当应用于创建表示例时,从 Unix 下的 psql 内部:

CREATE TABLE Two("first
second" text);

select convert_to(column_name::text,'UTF-8')
from information_schema.columns
where table_schema='public'
and table_name='two';

结果是:

        convert_to         
----------------------------
\x66697273740a7365636f6e64

对于更复杂的情况(例如,UTF-8 中具有多个字节的非 ascii 字符),更高级的查询可能会有所帮助,以获得易于阅读的代码点:

select c,lpad(to_hex(ascii(c)),4,'0') from (
select regexp_split_to_table(column_name::text,'') as c
from information_schema.columns
where table_schema='public'
and table_name='two'
) as g;

c | lpad
---+------
f | 0066
i | 0069
r | 0072
s | 0073
t | 0074
+| 000a
|
s | 0073
e | 0065
c | 0063
o | 006f
n | 006e
d | 0064

关于postgresql - 带换行符的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894628/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com