如何在MySQL中查询SET列而忽略排序?

时间:2017-08-22 15:21:08

标签: mysql sql

我有一个MySQL数据库,其表格具有SET类型列,其定义如下:

CREATE TABLE t (
col SET('V','A','L','U','E')
)

我想编写一个SELECT查询,返回col等于的所有行(' A',' L'' E') 这可以通过编写以下查询来完成:

SELECT * FROM t WHERE c = 'A,L,E'

我想写的查询对于非订购的输入也会返回相同的结果,例如' L' A' A' E' E' 39;

我无法找到一种优雅的方式,而且在官方文档中找不到任何可以帮助我的内容

3 个答案:

答案 0 :(得分:1)

您可以使用以下方法修复nacho的建议:

library(dplyr)

change <- function(x, elementsToChange = c("a"), changeTo=c(5)){

  if(length(elementsToChange)!=length(changeTo)) {stop("length of elementsToChange is not equal to changeTo")}
  temp<- tibble(name = names(x), value = x)
  temp.change<- tibble(name = elementsToChange, value = changeTo)
  temp2<-temp%>%left_join(temp.change, by = "name")
  temp2<-within(temp2, {
    value.y[is.na(value.y)]<- value.x[is.na(value.y)]
  })
  ret<-temp2$value.y
  names(ret)<-temp2$name
  return(ret)
}

这绝不是一个“优雅的解决方案”......如果可能,我宁愿使用更简单的解决方案。

FIND_IN_SET提供枚举中的位置,因此我们必须将此数字加2以获得SET值的内部表示。 当find_in_set返回0时,floor()函数用于保持表达式为0。

请注意,在检查非法SET值时,您仍然存在误报的风险(例如,查找“A”,“L”,“E”和“X”将返回true)

答案 1 :(得分:0)

您需要使用FIND IN SET

SELECT * 
FROM t 
WHERE FIND_IN_SET('A',c)>0 AND FIND_IN_SET('L',c)>0 AND FIND_IN_SET('E',c)>0

我不知道这是否有效,但您也可以尝试:

SELECT * 
FROM t 
WHERE FIND_IN_SET('A,L,E',c)>0 

答案 2 :(得分:0)

另一种可能的方法是分别检查每个项目+检查组的大小是否匹配(假设搜索的组没有重复):

SELECT * 
FROM t 
WHERE FIND_IN_SET('A',c)>0 AND FIND_IN_SET('L',c)>0 AND FIND_IN_SET('E',c)>0 AND BIT_COUNT(c) = 3