2

私のアプリでは、postgresqlを使用して次のような複合型の値を返しています。

select row('a','b','c','d');

このクエリは次を返します。

(あいうえお)

他の複合型などの配列を含む、より複雑な型を使用しています。DBレイヤーでは、戻り値を解析し、配列と他の複合体をそこから「解凍」します。

問題?

select row(array[1,2,3,4]);

select row('{1,2,3,4}');

まったく同じ出力が得られます。

("{1,2,3,4}")

'{1,2,3,4}'これが通常の文字列(おそらくユーザーによって提供されたもの)として意味されているのか、配列として意味されているのかをどのように区別できますか?

合成フィールド値のエスケープシーケンス{のようなものがあるべきではありませんか?}

PS私はのようなものを使用することはできませんselect * from row[1,2,3]

4

2 に答える 2

2

列タイプを判別する最も安全な方法は、結果セットのメタデータを照会することです。

フレームワーク/言語を指定しなかったため、方法がわかりません。一般に、いくつかの結果セットクラスを拡張し、そこでこの曖昧さを解決する必要があります。

于 2012-11-18T03:12:56.603 に答える
1

匿名のレコードを使用しているため、これは困難です。観察:

SELECT pg_typeof( row('{1,2,3,4}') ), pg_typeof( row(array[1,2,3,4]) );

可能であればCREATE TYPE、匿名レコード(ROW()コンストラクター)の代わりに名前付き型を使用してください。次に、行タイプを調べることができます。

CREATE TYPE r1 AS (col1 text);
CREATE TYPE r2 AS (col1 integer[]);

SELECT pg_typeof( row('{1,2,3,4}')::r1 ), pg_typeof( row(array[1,2,3,4])::r2 );

Ondrejが示唆しているように、プロトコルレベルの結果セットのメタデータには、レコードタイプを使用せずにこれを行う方法を提供する詳細が含まれている場合があります。

于 2012-11-18T03:50:42.477 に答える