web-dev-qa-db-ja.com

REDSHIFT SQLでの単一引用符のエスケープ

REDSHIFTテーブルの列に挿入する必要がある単一引用符を含む文字列値がたくさんあります。両方を使用しました/'および'' INSERTステートメントの単一引用符をエスケープします。

例えば.

INSERT INTO table_Temp
    VALUES ('1234', 'O\'Niel'), ('3456', 'O\'Brien')

私も\ 'の代わりに' 'を使用しましたが、「VALUESリストは同じ長さでなければなりません」、つまり各レコードの引数が2より大きいというエラーが繰り返し表示されます。

この問題を解決する方法を教えてください。

SQLの標準は二重の単一引用符です。

INSERT INTO table_Temp (col1, col2)  -- include the column names
    VALUES ('1234', 'O''Niel'), ('3456', 'O''Brien');

挿入する値に対応する列名も含める必要があります。それがおそらく2番目のエラーの原因です。

13
Gordon Linoff

お使いの環境にもよると思います。 Periscope Dataのredshift SQLエディターを使用しており、\はエスケープ文字として機能しました。 ''および\\ 動作しませんでした。

1
Greg Lewis

私は同様の問題に直面していました、それをクエリにデコードするために一種のJSON構造を送信する必要がありましたが、文字列を受信するプログラムがあり、このプログラムがエスケープをエスケープしていたため、クエリが失敗し、最終的にこれを見つけました:- $$をPostgreSQLのドル引用符付き文字列に入れます quote_literal(42.5)に言及 https://www.postgresql.org/docs/current/functions-string.html#FUNCTIONS-STRING-OTHER これで私の問題は解決します。文字列の例は
'LocalTime = {US/Central}; NumDays = {1}; NumRows = {3}; F_ID = {[アップル、オレンジ、バナナ]} '

Select  
   Param, value , replace(quote_literal(replace(replace(Value,'[',''),']','')),',',quote_literal(',')) ValueList 
    FROM (
    select 
        SPLIT_PART(split,'=',1) as Param,
        replace( replace(SPLIT_PART(split,'=',2),'{',''),'}','') as Value
    FROM 
    (
        select 
            trim(split_part(freeform.txt, ';', number.n)) as split 
        from 
        (   select 
            'LocalTime={US/Central}; NumDays={1}; NumRows={3}; F_ID={[Apple, Orange, Bannana]}' as txt
        ) freeform,
        (   select 1 as n union all
            select 2 union all
            select 3 union all
            select 4 union all
            select 5 union all
            select 6 union all
            select 7 union all
            select 8 union all
            select 9 union all
            select 10
        ) number
        where split <> ''
    ) as MY_TMP
    ) as valuePart
0
Mario

使用する \\' 脱出する '

s = s.replace("'", "\\'")
0
Swagatika