Mysql sql where子句-最佳实践:仅当其他字段匹配或设置为null时,才有权选择匹配字段

Mysql sql where子句-最佳实践:仅当其他字段匹配或设置为null时,才有权选择匹配字段,mysql,Mysql,很难在主题上更明确,需要解释问题 在该对话框中,选择: SELECT `id`, `creation_time`, `roster_date`, `roster_type`,`roster_report_time`, `flight_hrs`, `rank`, `email` FROM `alert_subscriptions` WHERE 1 我在where子句中有一个固定的值“rank”、“花名册日期”和“花名册类型”的组合。 问题是,我需要找到谁只在“rank”中插入了一个值,并将其

很难在主题上更明确,需要解释问题

在该对话框中,选择:

SELECT `id`, `creation_time`, `roster_date`, `roster_type`,`roster_report_time`, `flight_hrs`, `rank`, `email` 
FROM `alert_subscriptions` 
WHERE 1
我在where子句中有一个固定的值“rank”、“花名册日期”和“花名册类型”的组合。 问题是,我需要找到谁只在“rank”中插入了一个值,并将其他字段设置为null),或者谁在“Floster\u type”设置为null时设置了“rank”和“Floster\u date”,等等

只有当其他字段匹配或设置为空时,才有权选择具有匹配字段的人

当然,一个解决方案是在where子句中放入所有可能的组合(在本例中为7,例如RANKNULLORNULLDATENULLRNULLORNULLTYPE或RANKDATENULLRANKNULLTYPE..等等..),但我想找到一个优雅的解决方案,也很容易用更多字段进行更新(这个解决方案会让我发疯,在where子句中添加更多字段,组合的数量会大幅增加!)

我确信有一个解决方案包含一些select或union或view,但当我接近这个解决方案时,我会迷失方向,无法下定决心

我被卡住了,我需要一些外部的观点


谢谢大家

只需检查每个标准是否为
,并将其视为匹配的成功部分。然后您可以将每个标准测试与
组合

WHERE (year IS NULL OR year = 2010)
AND (type IS NULL OR type = 'wagon')
AND (size IS NULL OR size = '2L')

只需检查每个标准是否为
NULL
,并将其视为匹配的成功部分。然后,您可以将每个标准测试与
组合

WHERE (year IS NULL OR year = 2010)
AND (type IS NULL OR type = 'wagon')
AND (size IS NULL OR size = '2L')


我不明白你在问什么。你能展示一些样本数据和期望的结果吗?我怀疑你想要的是根据结果是否符合不同的标准来排序,然后使用
限制1
来获得第一个匹配。我想卖一辆车,2010,2L,四轮马车。迈克正在找一辆三轮马车。鲍勃找一辆四轮马车。卢克找一辆二轮马车。我想让我的select显示Bob和Luke。如果我在where子句中输入年份、大小和底盘,则不会给出任何结果。如果我使用OR,则会给出所有结果。我脑海中唯一的方法是在子句中描述所有组合。但我确信有一个更聪明的解决方案。好吧,正如我之前所写的,涵盖我拥有的3个字段组合描述7个案例,涵盖4个领域,它们将是15个案例,以此类推。有没有更聪明的解决方案?你能把它放在问题中吗?从你在那里写的内容来看,这几乎不明显。不清楚这些汽车属性如何与列
排名
花名册日期
花名册类型
匹配。我搞不清楚你在问什么。你能展示一些样本数据和期望的结果吗?我想你想要的是根据结果是否符合不同的标准来排序,然后使用
LIMIT 1
来获得第一个匹配项。我想卖一辆车,2010,2L,四轮马车。迈克正在找一辆三轮马车。鲍勃找一辆四轮马车。卢克找一辆二轮马车。我想我的选择是显示Bob和Luke。如果在where子句中输入年份、大小和底盘,则不会给出任何结果。如果使用OR,则会给出所有结果。我脑海中的唯一方法是在子句中描述所有组合。但我确信有一个更聪明的解决方案。好吧,正如我之前所写的,为了涵盖3个字段组合,我必须描述7个案例,涵盖4个领域,它们将是15个案例,以此类推..有没有更聪明的解决方案?你能提出这个问题吗?从你在那里写的内容来看,这几乎不明显。不清楚这些汽车属性如何与列
rank
花名册日期
花名册类型
匹配。因为
x=NULL
总是NULL,您也可以编写
IFNULL(year=2010,1)
COALESCE(…)
因此实际上,year=2010,size=2l,type=carg,IFNULL(year,2010)=2010…等等。对吗?不,你不需要第一部分,只需要
ifnull
之类的东西。@PaulSpiegel这样行,但我认为它的逻辑更混乱。@Barmar我建议这样做是为了不复制值。但我发现你的第二个解决方案是最清楚的。因为
x=NULL
总是空的,如果空(年份=2010,1)或
合并(…)
因此,实际年份=2010,尺寸=2l,类型=货车,如果空(年份,2010)=2010…等等。对吗?不,你不需要第一部分,只需要
ifnull
之类的东西。@PaulSpiegel这样行,但我认为它的逻辑更混乱。@Barmar我建议这样做是为了不复制值。但我发现你的第二个解决方案是最清楚的。