2013-12-26 4 views
0

Я пытался оценить регулярное выражение в PostgreSQL в where where.как оценивать значения выражения с параметром в postgres sql

У меня есть столбец со значением, подобным приведенному ниже примеру (1,2). Когда я пишу запрос в разделе where, я передаю значения параметров либо «a», либо «a, b» или «b», тогда он должен возвращать только строки, содержащие «a» или «a, b», или "b".

Когда я передаю «a», тогда он должен проверить значение строки и оценить условия «И», «ИЛИ».

Пример: 1

((((a.b.city == "x" AND a.b.state == "y" AND a.b.country == "z")) OR 
    (dis(x.y.d1, x.y.d2, "47.6015", "-122.3304") <= 5)) 
    AND ((p.q.test == "**a**") OR (p.q.test == "b"))) 

Пример: 2

((((a.b.city == "x" AND a.b.state == "y" AND a.b.country == "z")) OR 
    (dis(x.y.d1, x.y.d2, "123", "-456") <= 5)) AND ((p.q.test == "a,b") 

Вот пример запроса.

select * from testtable where column ='parameter' 

Просьба предложить.

+0

На вопрос, подобный этому, таблица выборочных данных и ожидаемых результатов значительно упрощает понимание. Так что вырезать несвязанный шум в ваших запросах. Всегда предлагайте свою версию PostgreSQL. –

ответ

1

Это очень сложно понять, что вы просите, но я думаю вы хотите IN(...).

E.g.

p.q.test IN ('a', 'b') 

эквивалентно

p.q.test = 'a' OR p.q.test = 'b' 

Вы можете передать массив в качестве параметра запроса, если список в соответствии динамична:

p.q.test IN (?) 

или список разделенных запятыми, чтобы соответствовать против :

p.q.test = ANY (regexp_split_to_array(?,',')) 

Если ваш p.q.test является список значений, разделенных запятыми, а затем разделить его, и сравнить его в массив возможных совпадений с использованием && (массив перекрывается) оператор:

WITH test(x) AS (VALUES ('a,b'), ('a'), ('b'), ('a,b,c'), ('b,c'), ('d,e'), ('e')) 
SELECT x, regexp_split_to_array(x, ',') && ARRAY['a','b'] FROM test; 

    x | ?column? 
-------+---------- 
a,b | t 
a  | t 
b  | t 
a,b,c | t 
b,c | t 
d,e | f 
e  | f 
(7 rows) 

Если && не совсем соответствует тому, что вы хотите, посмотрите на руководство по массивам; возможно, операторы @> или <@ (содержит/содержатся) - это то, что вам нужно.

Смежные вопросы