Kolonnenavne er identifikatorer, og de blodige detaljer i syntaksen for identifikatorer er beskrevet på:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :brug U&"..."
syntaks til at indsætte ikke-udskrivbare tegn i identifikatorer gennem deres Unicode-kodepunkter, og der er ingen måde at forene CR,LF
med LF
alene.
Sådan henvises til kolonnen på en enkelt linje
Vi har tilladelse til at bruge Unicode-escape-sekvenser i identifikatorer, så ifølge dokumentationen virker følgende:
select U&"first\000asecond" from Two;
hvis det kun er et linjeskift mellem de to ord.
Hvad sker der med forespørgslerne på den første tabel
Tabellen er oprettet med:
CREATE TABLE One("first\nsecond" text);
Da omvendt skråstreg ikke har nogen speciel betydning her, indeholder denne kolonne ikke nogen ny linje. Den indeholder first
efterfulgt af \
efterfulgt af n
efterfulgt af second
.Så:
SELECT "first\nsecond" from One;
virker, fordi det er det samme som det, der er i CREATE TABLE
hvorimod
SELECT "first
second" from One;
mislykkes, fordi der er en ny linje i den SELECT, hvor det faktiske kolonnenavn i tabellen har en omvendt skråstreg efterfulgt af en n
.
Hvad sker der med forespørgslerne på den anden tabel
Dette er det modsatte af "One".
CREATE TABLE Two("first
second" text);
Den nye linje tages ordret og er en del af kolonnen. Så
SELECT "first
second" from Two;
fungerer, fordi den nye linje er der præcis som i OPRET TABEL, med en indlejret ny linje, mens
SELECT "first\nsecond" from Two;
mislykkes, fordi som tidligere \n
betyder i denne sammenhæng ikke en ny linje.
Carriage Return efterfulgt af Newline eller noget mærkeligere
Som nævnt i kommentarer og din redigering, kan dette være vognretur og ny linje i stedet, i hvilket tilfælde følgende skal gøre:
select U&"first\000d\000asecond" from Two;
selvom jeg i min test trykkede Enter i midten af en kolonne med psql
på Unix og Windows har samme effekt:en enkelt ny linje i kolonnens navn.
For at kontrollere, hvilke nøjagtige tegn der endte i et kolonnenavn, kan vi inspicere dem i hexadecimal.
Når det anvendes på dit oprettet tabel eksempel, indefra 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 er:
convert_to
----------------------------
\x66697273740a7365636f6e64
For mere komplekse tilfælde (f.eks. ikke-ascii-tegn med flere bytes i UTF-8), kan en mere avanceret forespørgsel hjælpe, for letlæselige kodepunkter:
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