Kolumnnamn är identifierare, och de blodiga detaljerna för syntaxen för identifierare beskrivs på:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :använd U&"..."
syntax för att injicera icke-utskrivbara tecken i identifierare genom deras Unicode-kodpunkter, och det finns inget sätt att förena CR,LF
med LF
ensam.
Hur man refererar till kolumnen på en rad
Vi har tillåtelse att använda Unicode-escape-sekvenser i identifierare, så enligt dokumentationen fungerar följande:
select U&"first\000asecond" from Two;
om det bara är ett nyradstecken mellan de två orden.
Vad händer med frågorna i den första tabellen
Tabellen skapas med:
CREATE TABLE One("first\nsecond" text);
Eftersom omvänt snedstreck inte har någon speciell betydelse här, innehåller den här kolumnen ingen nyrad. Den innehåller first
följt av \
följt av n
följt av second
.Så:
SELECT "first\nsecond" from One;
fungerar eftersom det är samma som det som finns i CREATE TABLE
medan
SELECT "first
second" from One;
misslyckas eftersom det finns en ny rad i SELECT där det faktiska kolumnnamnet i tabellen har ett omvänt snedstreck följt av en n
.
Vad händer med frågorna i den andra tabellen
Detta är motsatsen till "En".
CREATE TABLE Two("first
second" text);
Nyraden tas ordagrant och är en del av kolumnen. Så
SELECT "first
second" from Two;
fungerar eftersom den nya raden är där precis som i CREATE TABLE, med en inbäddad nyrad, medan
SELECT "first\nsecond" from Two;
misslyckas eftersom som tidigare \n
betyder i detta sammanhang inte en ny rad.
Carriage Return följt av Newline, eller något konstigare
Som nämnts i kommentarerna och din redigering kan detta vara vagnretur och nyrad istället, i vilket fall följande bör göra:
select U&"first\000d\000asecond" from Two;
även om jag i mitt test trycker på Enter i mitten av en kolumn med psql
på Unix och Windows har samma effekt:en enda nyrad i kolumnens namn.
För att kontrollera vilka exakta tecken som hamnade i ett kolumnnamn kan vi inspektera dem i hexadecimalt format.
När det tillämpas på ditt skapa tabellexempel, inifrån psql under Unix:
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';
Resultatet är:
convert_to
----------------------------
\x66697273740a7365636f6e64
För mer komplexa fall (t.ex. icke-ascii-tecken med flera byte i UTF-8), kan en mer avancerad fråga vara till hjälp, för lättlästa kodpunkter:
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