簡體   English   中英

列表列的SQL WHERE子句

[英]SQL WHERE clause for column of lists

我如何指定WHERE子句,以便在列的值(字符串列表)和提供的另一個字符串列表之間存在交集的情況下返回一行? 就像是:

SELECT id, names
FROM table
WHERE ANY(names) = ANY(('John', 'Alice', 'Bob'))

因此,如果值names列為例如['George', 'Bob'] ,則應返回該行。

您實際上應該為此使用數組或記錄表

您可以通過在運行時將字符串拆分為數組使用PostgreSQL的數組功能來解決設計問題

SELECT id, names
FROM table
WHERE string_to_array(names, ',') && ARRAY['John', 'Alice', 'Bob'];

如果逗號分隔的值包含空格等,則可能需要regexp_split_to_array而不是string_to_array

如果您真的無法更改設計(我建議,正如克雷格·林格(Craig Ringer)所述)

您可以使用regexp_split_to_array

 SELECT id, names
    from (
    SELECT 
          id,
          names,
          regexp_split_to_table(names, ', ') as splitted_value
    from <yourTable>) t
    where splitted_value in ('John', 'Alice', 'Bob')
    group by id, names;

或更復雜的樣品

SELECT id, names
    from (
    SELECT 
          id,
          names,
          regexp_split_to_table(replace(replace(names, '[''', ''), ''']', ''), ''', ''') as splitted_value

    from <yourTable>) t
    where splitted_value in ('John', 'Alice', 'Bob')
    group by id, names;

使用某些json函數的另一種丑陋方式(因為您的列數據看起來像json)

“詳細信息” :我不是Postgresql專家,並且少於json數據部分中的所有內容。 因此,可能會有更好的方法來執行此操作。

select id, names 
from
 (select 
    id, 
    names,
    replace(cast(json_array_elements(cast(replace(names, '''', '"') as json)) as text), '"', '') as elem
  from <yourTable>) t
where elem in ('George', 'Bob');

您可以生成自己的函數來模仿MYSQL的FIND_IN_SET

CREATE OR REPLACE FUNCTION find_in_set(str text, strlist text)
RETURNS int AS $$
SELECT i
   FROM generate_subscripts(string_to_array($2,','),1) g(i)
  WHERE (string_to_array($2, ','))[i] = $1
  UNION ALL
  SELECT 0
  LIMIT 1
$$ LANGUAGE sql STRICT;

http://okbob.blogspot.ro/2009/08/mysql-functions-for-postgresql.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM