sql >> Databasteknik >  >> RDS >> PostgreSQL

Kolumnnamn med radbrytningar

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



  1. PostgreSQL-funktionen finns inte

  2. Använda Excel-kolumndata för att skapa SQL-sats som frågar databasen

  3. Kontrollera om mySQL-posten har lagts till under de senaste x sekunderna

  4. Hur beräknar jag tabellstorlek i Oracle