MYSQL SELECT但有条件

bxjv4tth  于 2023-10-15  发布在  Mysql
关注(0)|答案(3)|浏览(108)

是否可以在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

原文引用了专有的前端,但我只是想看看是否有一个单独的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

我想在查询中添加一个子句,如果用户没有从colA中选择一个独特的值,它将允许我返回其他内容。

bakd9h0s

bakd9h0s1#

你需要建立查询字符串,检查这个线程Mysql dynamically build query string in a stored procedure based on logic
像这样的查询

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
wsewodh2

wsewodh22#

SELECT *
FROM myTable
WHERE (colA) LIKE '%SearchString%'
OR (SelectAll) LIKE '%SA%'

我找到了一个变通方法,添加了一个SelectAll列,并在SELECT查询中引用该列

ldioqlga

ldioqlga3#

如果是编译语句,则不能更改列数。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部分相同。

相关问题