2016-05-18 4 views
0

私はプログラムデータを含むpostgresqlデータベースを持っています。 Libreoffice Calcには、PostgreSQLデータベースとやりとりするBasicマクロがあり、Calcをユーザークライアントとして使用しています。 postgresqlテーブルの1つに配列があり、その配列にBasicから直接インデックスを付けることができません。 pgAdminでに示すように、ここでLibreoffice BasicからSQL配列要素へのアクセス

は、テーブルの設定です:

sq_num integer, 
    year_start integer, 
    id serial NOT NULL, 
    "roleArray" text[] 

は私がroleArray [50]を選択してみたいと思います。基本的な結果からこれを行うすべての試みは、配列全体が渡されます。私は確かに配列を自分で分割して、私が後になっている要素を得ることができますが、私はSQL配列を使ってこのことを自動化していました。

私の基本コードでは、postgresqlデータベースへの接続にLibreoffice Baseファイルを使用しています。ベースファイルに行く、私は、「直接実行SQLコマンド」ボタンを選択しない限り、全体の配列を返すと、このクエリを実行し、個々の要素を選択しないであろうクエリを作成することはできません。

SELECT "roleArray"['50'] FROM myTableThatHasArrays 

それから私は、要素を取得します50をすべてのレコードから意図したとおりに削除します。

Baseコマンドパーサーが配列のインデックス付けを処理できないバグレポートがあると私は思っています。私の質問はこれを克服する最良の方法は何ですか?

SQL配列内の要素をBasicから直接索引付けできるのが最善のシナリオです。

+0

答えがない場合、これを回避する便利な方法は、配列全体を受け入れることです。最後に波カッコで囲まれたCSV文字列として受信されます。解決方法は、中括弧を分割してカンマで区切り、必要な要素にインデックスを付けることです。しかし、これは回避策であり、私が使用したい答えではありません。 – Smith

+0

ようこそStackOverflowへ!試した基本コードは何ですか? –

+0

言及しなければならないもう一つのこと:pgAdminにテーブル名を引用符で囲まないようにしてください。小文字で列名を入力しないと、これが実行されます。 – Smith

答えて

0

XRow.getStringのように聞こえますが、それは十分に感謝して配列を単一の大きな文字列として取得します。代わりに、XRow.getArray、次にXArray.getArrayを使用します。ここに実例があります:

sSQL = "SELECT id, ""roleArray""[2] FROM mytablethathasarrays;" 
oResult = oStatement.executeQuery(sSQL) 
s = "" 
Do While oResult.next() 
    sql_array = oResult.getArray(2) 
    basic_array = sql_array.getArray(Null) 
    s = s & oResult.getInt(1) & " " & basic_array(1) & CHR$(10) 
Loop 
MsgBox s 
+0

ああ、私は.getArrayを忘れていました。しかし、私は、oResultが要素[2]だけでなく、クエリから完全な配列を捕らえたと思います。 XRowメソッドは、行のデータにどのように解釈するのかを決定しますが、行がSQ​​Lクエリの値から詰め込まれた後です。インデックスが削除されていることをクエリがベースを通過する間に発生すると思います。サーバー上のSQLターミナルで呼び出されたクエリは要素2を返します。 "直接コマンド"モードのベースSQLターミナルで行われたクエリは、要素2を返します。上記のBasicから呼び出されたコードは、完全配列を返します。 – Smith

+0

配列を取得しますが、 'basic_array(1)'は特定の要素を取得します。だから、このコードはあなたが要求したものです。何かを解析する必要なしに、単に 'basic_array(50)'と言うことができます。 –

関連する問題