SQL - 在多个大量列中搜索多个值

时间:2016-08-20 14:02:09

标签: sql postgresql

要搜索列中的多个值,我们可以使用IN运算符,如下所示

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

但是有没有办法在多列中搜索多个值?例如 - 想要选择col1,col2,.. col100 any匹配的行(' v',' a',' l&#39 ;,' u',' e' s')

更新: -

虽然@Gordon的答案below可行,但情况是列数很多 - 有没有办法在不必为每列重复的IN语句的情况下完成此操作?

3 个答案:

答案 0 :(得分: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');

您的问题不清楚ORAND是否是正确的连接器。

注意:有四列包含基本相同的值是可疑的。您可能想询问有关数据模型本身的其他问题。

编辑:

您可以使用正则表达式:

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

我认为这是难以理解的,难以维持,但我确信其他人有不同的意见。

答案 1 :(得分:0)

我会编写一个函数f(col)来检查它是否在('v','a','l','u','e','s')然后使用

f(col1)或f(col2)或......

你必须在某个地方指定列,所以这就越接近你所能得到的。

与之前的回复一样,我会问为什么col1,col2等不是单独表中的单个条目。可能有合理的原因,但在我的经验中是非常不寻常的 - 除非您无法控制数据库布局。一个单独的表就是这样做的SQL或关系数据库方法。

答案 2 :(得分: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')