PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Nama kolom dengan jeda baris

Nama kolom adalah pengidentifikasi, dan detail sintaksis untuk pengidentifikasi dijelaskan di:

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

TL;DR :gunakan U&"..." sintaks untuk menyuntikkan karakter yang tidak dapat dicetak ke dalam pengidentifikasi melalui titik kode Unicode mereka, dan tidak ada cara untuk menyatukan CR,LF dengan LF sendirian.

Cara merujuk ke kolom dalam satu baris

Kami diizinkan menggunakan urutan pelarian Unicode dalam pengidentifikasi, jadi menurut dokumentasi, berikut ini berfungsi:

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

jika itu hanya karakter baris baru di antara dua kata.

Apa yang terjadi dengan kueri pada tabel pertama

Tabel dibuat dengan:

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

Karena karakter garis miring terbalik tidak memiliki arti khusus di sini, kolom ini tidak berisi baris baru. Kolom ini berisi first diikuti oleh \ diikuti oleh n diikuti oleh second .Jadi:

 SELECT "first\nsecond" from One;

berfungsi karena sama dengan yang ada di CREATE TABLE

sedangkan

SELECT "first
second" from One;

gagal karena ada baris baru di SELECT di mana nama kolom sebenarnya dalam tabel memiliki garis miring terbalik diikuti oleh n .

Apa yang terjadi dengan kueri pada tabel kedua

Ini adalah kebalikan dari "Satu".

CREATE TABLE Two("first
second" text);

Baris baru diambil kata demi kata dan merupakan bagian dari kolom. Jadi

SELECT "first
second" from Two;

berfungsi karena baris baru ada persis seperti di CREATE TABLE, dengan baris baru yang disematkan, sedangkan

SELECT "first\nsecond" from Two;

gagal karena seperti sebelumnya \n dalam konteks ini tidak berarti baris baru.

Carriage Return diikuti oleh Newline, atau yang lebih aneh

Seperti yang disebutkan dalam komentar dan hasil edit Anda, ini bisa berupa carriage return dan baris baru sebagai gantinya, dalam hal ini hal berikut harus dilakukan:

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

meskipun dalam pengujian saya, tekan Enter di tengah kolom dengan psql di Unix dan Windows memiliki efek yang sama:satu baris baru di nama kolom.

Untuk memeriksa karakter persis apa yang berakhir dalam nama kolom, kita dapat memeriksanya dalam heksadesimal.

Saat diterapkan ke contoh tabel buat Anda, dari dalam psql di bawah 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';

Hasilnya adalah:

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

Untuk kasus yang lebih kompleks (misalnya karakter non-ascii dengan beberapa byte dalam UTF-8), kueri yang lebih canggih mungkin membantu, untuk titik kode yang mudah dibaca:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melacak Ketersediaan Tinggi untuk PostgreSQL Dengan Detak Jantung

  2. Kesalahan saat menjalankan migrasi:sqlalchemy.exc.CompileError:Jenis ENUM Postgresql memerlukan nama

  3. ekstrak tanggal dari stempel waktu di postgreSQL

  4. Persistence.createEntityManagerFactory() membutuhkan waktu yang sangat lama untuk kembali

  5. Naikkan kesalahan saat tanggal tidak valid