我有一个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;
我无法找到一种优雅的方式,而且在官方文档中找不到任何可以帮助我的内容
答案 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