2016-08-20 7 views
0

Для поиска несколько значений в столбце можно использовать IN оператор, как показано нижеSQL - поиск нескольких значений в нескольких большом количестве столбцов

SELECT * FROM some_table WHERE some_col IN ('v', 'a', 'l', 'u', 'e' , 's'); 

Однако есть способ поиска несколько значений в нескольких столбцах? В качестве примера - хотите выбрать строки, где any col1, col2, ..col100 что-то соответствует ('v', 'a', 'l', 'u', 'e', ​​'s')

Обновление : -

В то время как ответ below от @Gordon будет работать, сценарий - это число, в котором много столбцов - есть ли способ сделать это без необходимости повторять инструкцию IN для каждого столбца?

+0

Если все COLS col1, col2 .. соответствовать некоторое значение ('v', 'a' ..) или любое совпадение? –

+0

Любой - ИЛИ является хорошим – user3206440

+0

Если вам не нужна скорость: 'select * from your_table, где avals (hstore (your_table)) && array ['v', 'a', 'l', 'u', 'e ',' s ']; 'Читайте об [hstore extension] (https://www.postgresql.org/docs/current/static/hstore.html) и о [операторы массива] (https: //www.postgresql. org/docs/current/static/functions-array.html) – Abelisto

ответ

2

Один простой способ - несколько сравнений. Что-то вроде этого:

SELECT * 
FROM some_table 
WHERE col1 IN ('v', 'a', 'l', 'u', 'e' , 's') OR 
     col2 IN ('v', 'a', 'l', 'u', 'e' , 's') OR 
     col3 IN ('v', 'a', 'l', 'u', 'e' , 's') OR 
     col4 IN ('v', 'a', 'l', 'u', 'e' , 's'); 

Ваш вопрос остается неясным ли OR или AND будет правильным разъем.

Примечание: наличие четырех столбцов, содержащих по существу одинаковые значения, является подозрительным. Возможно, вы захотите задать другой вопрос о своей модели данных.

EDIT:

Вы можете использовать регулярные выражения:

where concat_ws(':', col1, col2, col3, col4) ~ '^[values][:][values][:][values][:][values]$') 

Я считаю это непостижимы и трудно поддерживать, но я уверен, что другие имеют разные мнения.

+0

true - я должен был добавить соединитель - в этом случае это будет OR. Однако я искал случай, когда количество столбцов может быть много - это выполняет свою работу, но есть ли другой способ справиться с этим, не имея инструкции IN для каждого столбца? – user3206440

+0

@ пользователь3206440. , , Похоже, данные должны быть реструктурированы с одной строкой на значение столбца. –

0

Я хотел бы написать функцию F (COL), которая проверяет, если он находится в ('V', 'а', 'L', 'и', 'е', 'S'), а затем использовать

f (col1) или f (col2) или ...

Вы должны указать столбцы где-нибудь, так что это приближается к столь компактному, как вы можете получить.

Как и предыдущий ответ, я бы спросил, почему col1, col2 и т. Д. Не являются отдельными записями в отдельной таблице. Может быть, есть законная причина, но это очень необычно для моего опыта - если у вас нет контроля над компоновкой БД. Отдельной таблицей является способ SQL или реляционный db для этого.

+0

В аналогичном ключе еще 2 комментария здесь вы можете использовать массивы и любой оператор: any (array [col1, col2, ...]) = any (array ['v', 'a', 'l ',' u ',' e ',' s ']). Не уверен, что у меня есть синтаксис справа, синтаксис сложнее получить право и не может проверить это из дома. Это работает в Postgres, и я думаю, что это в стандарте SQL, но не уверен, что у него есть другие SQL. – DoggyKennel

0

Это не самое красивое решение, но он предлагает некоторую масштабируемость (и меньше избыточности в коде) над стандартными решениями:

select * 
from some_table 
where 
    to_tsvector (format ('%s %s %s %s %s', col1, col2, col3, col4, col5)) @@ 
    to_tsquery('v | a | l | u | e | s') 
Смежные вопросы