提问人:RMC 提问时间:10/5/2023 最后编辑:RMC 更新时间:10/11/2023 访问量:66
MYSQL SELECT,但有条件
MYSQL SELECT but with conditions
问:
是否可以在MYSQL SELECT语句中包含取决于用户选择的条件?为清楚起见,进行了编辑。 可以这样做的东西:
IF user *does A* SELECT * FROM myTable
IF user *does B* SELECT colB, colC, colD FROM myTable
ELSE SELECT * FROM myTable WHERE ID < 5
Original Post引用了专有前端,但我只想看看仅在MYSQL查询中是否有解决方案。
我有一个MYSQL查询,它根据列值的下拉选择返回表的过滤视图。我想包含一个选项,如果下拉列表与列中的值不匹配,或者用户选择“全部显示”,则返回所有表。像这样的东西:
有没有办法像这样使用 ELSE:
SELECT colA FROM mytable
WHERE *userChoice* = colA
ELSE SELECT * FROM myTable
或者,我认为可以用 case 语句来完成,但我无法弄清楚语法:
CASE
WHEN userPick = colA THEN SELECT colA FROM myTable
WHEN userPick = colB THEN SELECT colB FROM myTable
WHEN userPick = selectAll THEN SELECT * FROM myTable
ELSE SELECT * FROM myTable
END
答:
2赞
Jualrumahmu.com
10/5/2023
#1
需要构建查询字符串,检查此线程 Mysql 基于逻辑在存储过程中动态构建查询字符串
使用下面的查询,如下所示
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(input VARCHAR(15))
BEGIN
SET @input = input;
if @input="asc" then
SET @sort = " order by ActivityLogKey asc";
elseif @input = "desc" then
SET @sort = " order by ActivityLogKey desc";
else
SET @sort ="";
end if;
SET @query = CONCAT('select * from activitylog ',@sort,' limit 0, 5');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
0赞
RMC
10/10/2023
#2
SELECT *
FROM myTable
WHERE (colA) LIKE '%SearchString%'
OR (SelectAll) LIKE '%SA%'
我找到了一个解决方法,我添加了一个 SelectAll 列并在我的 SELECT 查询中引用了它
0赞
gaborsch
10/10/2023
#3
如果是已编译的语句,则无法更改列数。语句应返回相同数量的列。select
您可以做的是返回所有可能的列,并使用联合构造来启用具有特定 where 条件的选择。这样,您可以使用不同的表、不同的 where 条件 - 甚至不同的列(如果您的处理逻辑可以处理的话)。关键是联合中的所有选择都必须返回相同数量的列,因此您需要作为占位符返回。第一个选择必须定义所有列别名,尤其是当值为 null 时。null
SELECT t1.colA, null as colB, null as colC
FROM myTable t1
where userPick = colA
UNION ALL
SELECT null, t2.colB, null
FROM myTable t2
where userPick = colB
and t2.id < 5
UNION ALL
SELECT t3.colA, t3.colB, t3.colC
FROM myTable t3
where userPick <> colA AND userPick <> colB -- this is the ELSE part
请注意,您不需要分支,因为它与部件相同。userPick = selectAll
ELSE
评论
0赞
RMC
10/16/2023
嗨,谢谢,我不想更改列数,很抱歉,我没有在我的粗略草图中显示过滤表的整个版本。我想要在选择查询中有一个过滤的返回选项,如果需要,可以选择清除过滤器/全选
评论