列名は識別子であり、識別子の構文の詳細については、次のURLで説明しています。
TL; DR :U&"..."
を使用します 印刷不可能な文字をUnicodeコードポイントを介して識別子に挿入する構文。CR,LF
を統合する方法はありません。 LF
を使用 一人で。
1行で列を参照する方法
識別子にUnicodeエスケープシーケンスを使用することが許可されているため、ドキュメントによると、次のように機能します。
select U&"first\000asecond" from Two;
2つの単語の間の改行文字の場合。
最初のテーブルのクエリはどうなりますか
テーブルは次のもので作成されます:
CREATE TABLE One("first\nsecond" text);
ここでは円記号には特別な意味がないため、この列には改行が含まれていません。first
が含まれています。 続いて\
続いてn
続いてsecond
.So:
SELECT "first\nsecond" from One;
CREATE TABLE
にあるものと同じであるため、機能します
一方
SELECT "first
second" from One;
そのSELECTに改行があり、テーブルの実際の列名にバックスラッシュとそれに続くn
があるため、失敗します。 。
2番目のテーブルのクエリはどうなりますか
これは「One」の反対です。
CREATE TABLE Two("first
second" text);
改行は逐語的に取られ、列の一部です。したがって、
SELECT "first
second" from Two;
改行がCREATETABLEとまったく同じように存在し、改行が埋め込まれているため、機能しますが、
SELECT "first\nsecond" from Two;
以前のように\n
であるため、失敗します この文脈では、改行を意味するものではありません。
キャリッジリターンに続いて改行、またはその他の奇妙なもの
コメントと編集で述べたように、これは代わりにキャリッジリターンと改行である可能性があります。その場合、次のようにする必要があります。
select U&"first\000d\000asecond" from Two;
私のテストでは、psql
を使用して列の中央でEnterキーを押しています。 UnixとWindowsでも同じ効果があります。つまり、列名に1つの改行が含まれます。
列名に含まれる正確な文字を確認するために、16進数で検査できます。
Unixのpsql内から、テーブル作成の例に適用する場合:
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';
結果は次のとおりです。
convert_to
----------------------------
\x66697273740a7365636f6e64
より複雑なケース(UTF-8で数バイトの非ASCII文字など)の場合、読みやすいコードポイントの場合は、より高度なクエリが役立つ場合があります。
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