SQL - поиск нескольких значений в нескольких столбцах

sql postgresql

64 просмотра

3 ответа

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

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

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

Обновить:-

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

Автор: user3206440 Источник Размещён: 08.11.2019 11:24

Ответы (3)


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будет правильный разъем.

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

РЕДАКТИРОВАТЬ:

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

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

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

Автор: Gordon Linoff Размещён: 20.08.2016 02:04

0 плюса

Я написал бы функцию f (col), которая проверяет, находится ли она в ('v', 'a', 'l', 'u', 'e', ​​'s'), а затем использует

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

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

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

Автор: DoggyKennel Размещён: 20.08.2016 03:12

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')
Автор: Hambone Размещён: 20.08.2016 07:00
Вопросы из категории :
32x32