4

コンマ区切りのテキスト値をリストに変換して、SQL で「IN」を使用できるようにする方法はありますか? これにはPostgreSQLを使用しました。

元。:

select location from tbl where 
location in (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))

このクエリ:

select (replace(replace(replace('[Location].[SG],[Location].[PH]', ',[Location].[', ','''), '[Location].[', ''''), ']',''''))

「SG」、「PH」を生成します

このクエリを作成したかった:

select location from tbl where location in ('SG','PH')

最初のクエリを実行したときに何も返されませんでした。テーブルには、場所の値 'SG' と 'PH' が入力されています。

PL/pgSQLを使用せずにこれを機能させる方法について誰か助けてもらえますか?

4

3 に答える 3

2

あなたはフレンドリー使いやすいツールに直面していますが、仕事を終わらせることはできません。私はあなたの痛みを感じます.

組み合わせたものを少し変更するだけでstring_to_array、仕事を成し遂げることができるはずです。

replace最初に、ネストされた呼び出しを少し良いreplace呼び出しに置き換えます。

=> select replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', '');
 replace 
---------
 SG,PH

そのため、[Location].ノイズを取り除き、残りの括弧を取り除き、目的の 2 文字のロケーション コードのカンマ区切りのリストを取得します。SG,PHPostgreSQL の他の文字列および正規表現関数を使用して取得する方法は他にもありますがreplace(replace(replace(...、特定の構造を持つ文字列に対してはうまくいきます。

次に、次を使用してその CSV を配列に分割できますstring_to_array

=> select string_to_array(replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', ''), ',');
 string_to_array 
-----------------
 {SG,PH}

位置コードの配列を提供します。配列ができたので、配列内を調べる= ANY代わりに使用できます。IN

=> select 'SG' = any (string_to_array(replace(replace(replace('[Location].[SG],[Location].[PH]', '[Location].', ''), '[', ''), ']', ''), ','));
 ?column? 
----------
 t

これtはブール値の TRUE BTW です。代わりに (つまり FALSE) を'XX' = any (...)取得すると言った場合。f

すべてをまとめると、次のような構造の最終的なクエリが得られます。

select location
from tbl
where location = any (string_to_array(...))

...ネストされたreplace不快感を自分で埋めることができます。

于 2013-02-14T04:03:24.350 に答える
1

フォーム内の要素のコンマ区切りリストを扱っていると仮定すると、[Location].[XX]この構成が最適に機能すると予想されます。

SELECT location
FROM   tbl
JOIN  (
    SELECT substring(unnest(string_to_array(
             '[Location].[SG],[Location].[PH]'::text, ',')), 13, 2) AS location
    ) t USING (location)

ステップバイステップ

  • カンマ区切りのリストを配列に変換し、 でテーブルに分割しますunnest(string_to_array(...))
    で同じことができます: regexp_split_to_table(). 少し短く、弦が長いほど遅くなります。

  • XXで部分を抽出しsubstring()ます。非常にシンプルで高速です。

  • JOIN式のtbl代わりにIN。より速くする必要があります。
    列エイリアスを割り当ててlocation、等結合を有効にしますUSING (..)

于 2013-02-14T09:11:40.797 に答える
0

(「何か」)で場所を直接使用する

INに句を使用するフィドルを作成しましたVARCHAR

http://sqlfiddle.com/#!12/cdf915/1

于 2013-02-14T02:50:47.140 に答える