sql >> Databáze >  >> RDS >> PostgreSQL

Názvy sloupců se zalomením řádků

Názvy sloupců jsou identifikátory a krvavé podrobnosti syntaxe identifikátorů jsou popsány na adrese:

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

TL;DR :použijte U&"..." syntaxe pro vkládání netisknutelných znaků do identifikátorů prostřednictvím jejich kódových bodů Unicode a neexistuje způsob, jak sjednotit CR,LF s LF sám.

Jak odkazovat na sloupec v jednom řádku

V identifikátorech můžeme používat sekvence escape Unicode, takže podle dokumentace funguje následující:

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

pokud je to pouze znak nového řádku mezi dvěma slovy.

Co se stane s dotazy v první tabulce

Tabulka je vytvořena pomocí:

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

Protože zde znak zpětného lomítka nemá žádný zvláštní význam, tento sloupec neobsahuje žádný nový řádek. Obsahuje first následovaný \ následuje n následuje second .Takže:

 SELECT "first\nsecond" from One;

funguje, protože je stejný jako v CREATE TABLE

zatímco

SELECT "first
second" from One;

selže, protože v tomto SELECTu je nový řádek, kde skutečný název sloupce v tabulce má zpětné lomítko následované n .

Co se stane s dotazy ve druhé tabulce

Toto je opak "Jedna".

CREATE TABLE Two("first
second" text);

Nový řádek je převzat doslovně a je součástí sloupce. Takže

SELECT "first
second" from Two;

funguje, protože nový řádek je tam přesně jako v CREATE TABLE, s vloženým novým řádkem, zatímco

SELECT "first\nsecond" from Two;

selže, protože jako dříve \n v tomto kontextu neznamená nový řádek.

Carriage Return následovaný novým řádkem nebo něčím divnějším

Jak je uvedeno v komentářích a vaší úpravě, může to být návrat vozíku a nový řádek, v takovém případě by mělo fungovat následující:

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

i když v mém testu stiskněte Enter uprostřed sloupce s psql na Unixu a Windows má stejný účinek:jeden nový řádek v názvu sloupce.

Abychom zjistili, jaké přesné znaky skončily v názvu sloupce, můžeme je zkontrolovat v šestnáctkové soustavě.

Při použití na váš příklad vytvoření tabulky zevnitř psql pod 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';

Výsledek je:

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

U složitějších případů (např. ne-ascii znaky s několika bajty v UTF-8) může pomoci pokročilejší dotaz pro snadno čitelné kódové body:

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. Jak vytvořit jedinečné omezení pro více sloupců v SQL Server - SQL Server / TSQL výukový program, část 96

  2. Potřebujete pomoc s přístupem k databázi mysql pomocí node.js

  3. Jak získat rozsah náhodného celého čísla mysql?

  4. Rychlý způsob generování zřetězených řetězců v Oracle