mysql - MySQL - 根据包含 where 子句的另一个列值选择特定列
问题描述
我将永远欠一个可以帮助我解决我遇到的案件/问题的人:
有一个表结构如下:
id(AI)| ColA | ColB | ColC
-----------------------------
1 |1 | lorem | ipsum
2 |1 | dolor | sit
3 |0 | amet | nula
...
我想根据 ColA 中的值设置要搜索的列(ColB 或 ColC)。例如(伪查询):
- select * from table if ColA = 1 then ColB like '%some_criteria%' else if ColA = 0 then (ColB like '%some_criteria%' and ColC like '%some_criteria%')
基本上,在同一个查询中:
- 如果 ColA 的值为“1”,则仅在 ColB 中搜索
- 如果 ColA 的值为“0”,则在 ColB 和 ColC 中搜索
假设 ColB 存储文章标题,ColC 存储文章描述。ColA 存储文章类型。因此,如果文章类型为 1,则仅在标题中搜索,如果文章类型为 0,则在标题和描述中搜索。
预先感谢您的帮助!
解决方案
您可以使用“where”子句中的 SQL Switch/CaseWHERE
子句
中的条件来执行此操作
SELECT *
FROM table
WHERE
(ColA = 1 AND ColB LIKE '%some_criteria%')
OR
(ColA = 0 AND (ColB LIKE '%some_criteria%' OR ColC LIKE '%some_criteria%'))
另外,一个简单UNION
的例子可以作为另一个例子https://www.w3schools.com/sql/sql_union.asp
SELECT *
FROM table
WHERE ColA = 1 AND ColB LIKE '%some_criteria%'
UNION ALL
SELECT *
FROM table
WHERE ColA = 0 AND (ColB LIKE '%some_criteria%' OR ColC LIKE '%some_criteria%')
请注意,UNION ALL
如果发生任何重复,它将返回重复,并且只UNION
返回不同的行。
推荐阅读
- swift - 在 Swift 中使用 NMSSH 通过 sftp 检索数据
- angular - Angular 8:如何将点击事件发送到特定坐标
- vue.js - 将 v-model 附加到在 Vue.js 中使用 .appendChild 添加的动态元素
- flutter - 将日期格式化为月数和年数
- kotlin - Proguard 移除 lambda 调用
- python - 熊猫重塑列
- android - 为什么在android设备中运行项目时会发生这种与firebase相关的flutter错误?
- node.js - TypeError:无法使用 Express 读取 Node js 中未定义的属性“名称”
- python - pygame.quit() 在切换文件时给出 init.font 错误
- mysql - 针对 ActiveRecord 中的另一个数组查询 mysql json 数组