2

次の形式の PostgreSQL テーブルがあります。

uid  |    defaults  |  settings
-------------------------------
abc  |   ab, bc     |     -
     |              |
pqr  |   pq, ab     |     -
     |              |
xyz  |   xy, pq     |     -

列に ab を含むすべての uid をリストしようとしていdefaultsます。上記の場合は、abc記載pqrする必要があります。

クエリを作成し、テーブルをループして bash の各行をチェックするにはどうすればよいですか?

4

3 に答える 3

3

@ user000001 はすでに bash part を提供しています。クエリは次のようになります。

SELECT uid
FROM   tbl1
WHERE  defaults LIKE '%ab%'

しかし、これは'fab' または 'abz' も検出するため、本質的に信頼できません。高速なインデックスを作成することも困難です。

スキーマの正規化を検討してください。tbl2個々のデフォルトのエントリと への外部キーを持つ別の 1:n テーブルがあることを意味しますtbl1。次に、クエリは次のようになります。

SELECT uid
FROM   tbl1 t1
WHERE  EXISTS
   (SELECT 1
    FROM   tbl2 t2
    WHERE  t2.def = 'ab'  -- "default" = reserved word in SQL, so I use "def"
    AND    t2.tbl1_uid = t1.uid);

または、少なくとも配列を使用しdefaultsます。次に、クエリは次のようになります。

SELECT uid
FROM   tbl1
WHERE  'ab' = ANY (defaults);
于 2013-08-14T10:54:48.990 に答える
2

これは実際には bash に関するものではありませんが、psql を使用してクエリ コマンドを呼び出すことができます。この形式を試すことができます:

psql -U username -d database_name -c "SELECT uid FROM table_name WHERE defaults LIKE 'ab, %' OR defaults LIKE '%, ab'

それとも単に

psql -U username -d database_name -c "SELECT uid FROM table_name WHERE defaults LIKE '%ab%'

-U usernameオプションです。

于 2013-08-14T10:59:58.817 に答える