1

私の問題のモックアップコード:

SELECT Id FROM Tags WHERE TagName IN '<osx><keyboard><security><screen-lock>'

問題の詳細

apple.stackexchange データから 2011 年に使用されたタグを取得しようとしています。(このクエリ)

ご覧のとおり、タグ変更のタグはプレーン テキストとしてTextフィールドに保存されます。 stackexchange タグを使用した出力例

<tag1><tag2><tag3>
<osx><keyboard><security><screen-lock>

Tagsこのハードコードされたバージョンの代わりに、タグの一意のリストを作成してテーブルで検索するにはどうすればよいですか:

SELECT * FROM Tags
  WHERE TagName = 'osx' 
     OR TagName = 'keyboard' 
     OR TagName = 'security'

これはインタラクティブな例です。

Stackexchange は T-SQL を使用し、ローカル コピーは Postgres アプリバージョン 9.4.5.0を使用して postgresql で実行されています。

4

2 に答える 2

1

関連する列のみにデータを単純化し、それtagsを呼び出して例を示しました。

サンプルデータ

create table posthistory(tags text);
insert into posthistory values
  ('<lion><backup><time-machine>'),
  ('<spotlight><alfred><photo-booth>'),
  ('<lion><pdf><preview>'),
  ('<pdf>'),
  ('<asd>');

タグの一意のリストを取得するためのクエリ

SELECT DISTINCT
  unnest(
    regexp_split_to_array(
      trim('><' from tags), '><'
    )
  )
FROM
  posthistory

最初に、各行から先頭と末尾>の記号をすべて削除し、関数を使用して値を配列に取得し、配列を一連の行に展開します。最後に、重複する値を排除します。<regexp_split_to_array()unnest()DISTINCT

SQLFiddleそれがどのように機能するかをプレビューするために提示します。

于 2015-12-28T17:21:02.043 に答える
1

次のテーブル定義を想定します。

CREATE TABLE posthistory(post_id int PRIMARY KEY, tags text);

あなたが正確に望むものに応じて:

文字列を配列に変換するには、先頭と末尾の '<>' を削除してから、'><' をセパレータとして扱います。

SELECT *, string_to_array(trim(tags, '><'), '><') AS tag_arr
FROM   posthistory;

テーブル全体の一意のタグのリストを取得するには (これが必要だと思います):

SELECT DISTINCT tag
FROM   posthistory, unnest(string_to_array(trim(tags, '><'), '><')) tag;

暗黙的LATERALな結合には、Postgres 9.3 以降が必要です。

これは、正規表現を使用するよりもかなり高速です。正規表現を試してみたい場合は、別の回答で提案されているように、regexp_split_to_table()代わりに使用してください。regexp_split_to_array()unnest()

SELECT DISTINCT tag
FROM   posthistory, regexp_split_to_table(trim(tags, '><'), '><') tag;

また、暗黙のLATERAL結合を使用します。関連している:

特定のタグを検索するには:

SELECT *
FROM   posthistory
WHERE  tags LIKE '%<security>%'
AND    tags LIKE '%<osx>%';

SQL フィドル。

データ エクスプローラーの T-SQL での検索に適用されます。

SELECT TOP 100
       PostId, UserId, Text AS Tags FROM PostHistory
WHERE  year(CreationDate) = 2011
AND    PostHistoryTypeId IN (3  -- initial tags
                           , 6  -- edit tags
                           , 9) -- rollback tags
AND    Text LIKE ('%<' + ##TagName:String?postgresql## + '>%');

+(T-SQL 構文は、代わりに非標準を使用します||。)
https://data.stackexchange.com/apple/query/edit/417055

于 2015-12-29T06:11:30.513 に答える