2017-01-14 15 views
-2

help-meは、以下の例のような文字列の最初の "cost"の値だけを取得するSQLコマンドを設定できますか?sql Postgresqlで文字列変数を取得する方法

次の2つの結果は、SQLクエリ実行プランが格納されているテーブルから返されます。私はPostgresを使用します。コストは常に最初から来ますが、必ずしも同じ位置にあるとは限りませんので、部分文字列(...)を単純に行うことはできません。私はコスト値だけを抽出できるようにするたびに、最初と最後のポジションを見つけるべきだと思います。誰かが私を助けることができる場合、次の例の期待される結果は次のとおりです。

select (....) 
----------------- 
cost=399301 (only this) 

----------------------サンプルソース--- ---------------

Sort (cost=399301.55..399301.57 rows=6 width=36) 
    Sort Key: l_returnflag, l_linestatus 
    -> HashAggregate (cost=399301.21..399301.48 rows=6 width=36) 
     -> Seq Scan on h_lineitem (cost=0.00..250095.98 rows=5968209 width=36) 
       Filter: (l_shipdate <= (to_date('1998/12/01'::text, 'YYYY/MM/DD'::text) - '10 days'::interval day)) 

--------------------第2サンプル------ --------------------------

Aggregate (cost=7922058.70..7922058.71 rows=1 width=16)" 
    -> Hash Join (cost=1899763.92..7922058.69 rows=1 width=16)" 
     Hash Cond: (h_lineitem.l_partkey = h_part.p_partkey)" 
     Join Filter: (((h_part.p_brand = 'Brand#13'::bpchar) AND (h_part.p_container = ANY ('{"SM CASE","SM BOX","SM PACK","SM PKG"}'::bpchar[])) AND (h_lineitem.l_quantity >= 4::double precision) AND (h_lineitem.l_quantity <= 14::double precision) AND (h_ (...)" 
     -> Seq Scan on h_lineitem (cost=0.00..235156.84 rows=211094 width=32)" 
       Filter: ((l_shipmode = ANY ('{AIR,"AIR REG"}'::bpchar[])) AND (l_shipinstruct = 'DELIVER IN PERSON'::bpchar))" 
     -> Hash (cost=1183158.46..1183158.46 rows=35278997 width=33) 
-> Seq Scan on h_part (cost=0.00..1183158.46 rows=35278997 width=33) Filter: (p_size >= 1)" 

よろしく

+0

あなたの書式設定が私に腹を立てているからと言って、私は閉じようとしています。強くお試しください。これはあなたの最初のロデオではありません。 –

+0

Evanは、ここでの最大の目標は、プログラミングの問題に関する技術協力であり、カラフルで整形されたテキストを持たないことです。これは注意を呼びます。これは二次質問です。このフォーラムの大きな目標を理解していただければ幸いです。お待ちしています – Neto

+0

あなただけのことではありません。私はあなたを知りません。私はコミュニティのために良い質問に効率的に答えるためにここにいます。私がこの質問に答えることは、あなたが書式設定とプレゼンテーションを完全に駄目にしていない場合にのみ、他の人に助けになります。だから社会病にならないでください。あなたの質問をより良く伝えることができれば、それをしてください。これは、同じ問題を抱えている人、将来の人には役に立ちます。 –

答えて

0

計画がexecution_plan次を使用することができますという名前の列でplan_tableという名前のテーブルに格納されていると仮定すると:

select replace(substring(execution_plan from '\(cost=[0-9]+'), '(cost=', '') 
from plan_table; 

substring(...)(cost=の最初の出現を返し、replaceは、その接頭辞を削除するために使用されます。

+0

親愛なるこのSugestionは非常に優れていましたが、このdbmsはテーブル内のプランをメモリやログ(ファイル・テキスト)のみで保持しないため、postgresqlで修正しました。私は値の次が必要 "。"例えば:コスト= 27726324.40..27726324.41。私は正規表現を次のように修正しました。select substring( '集計(コスト= 27726324.40..27726324.41' \ [0-9] +。?[0-9] {2} ');結果27726324.40 – Neto

+0

私は以下のコードで成功します(最初の点を除く):select substring( '集計(コスト= 27726324.40..27726324.41行\ [。] [0-9] +。?[0-9] {2} '; RESULT .27726324.41。しかし、最初のポイント(。)はショーではなく、数字だけが好きです。どのように始点を得るためのヒントがあります。 – Neto

0

私は成功を取得し、解決策は、obcjetiveは値27726324.41を取得し、式定期最終developtedは次のとおりです。助けて-私を

select substring('Aggregate (cost=27726324.40..27726324.41 Rows' from '[.]Y*([0-9]+.?[0-9]{2})') 

RESULT 27726324.41

ありがとうa_horse_with_no_nameとanothers 。

関連する問題