咨询四列数据表两类场景的最优SQL查询语句
嘿,我来帮你搞定这两个SQL查询需求,针对你的四列表格,咱们一步步拆解:
1. 查询所有四列均为'Listed'的行
这个需求逻辑很直接,就是要筛选出每一列的值都是'Listed'的行,用AND把四个列的匹配条件连起来就行:
SELECT * FROM your_table WHERE Column1 = 'Listed' AND Column2 = 'Listed' AND Column3 = 'Listed' AND Column4 = 'Listed';
记得把your_table替换成你实际的表名哦。
2. 查询部分列为价格、部分列为'Listed'的行
这里的核心是至少有一列是价格格式,同时至少有一列是'Listed',不能全是价格也不能全是'Listed'。我们可以用两种思路来实现:
思路一:直接匹配法(明确满足“有Listed也有价格”)
先判断至少有一列是'Listed',再判断至少有一列符合价格格式(比如($3.99)这种):
SELECT * FROM your_table WHERE -- 至少有一列是Listed (Column1 = 'Listed' OR Column2 = 'Listed' OR Column3 = 'Listed' OR Column4 = 'Listed') AND -- 至少有一列是价格格式(这里用正则匹配,不同数据库语法可能略有差异) (Column1 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' OR Column2 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' OR Column3 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' OR Column4 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$');
思路二:排除法(去掉全Listed和全价格的行)
先排除掉第一个查询里全是'Listed'的行,再排除掉所有列都是价格的行,剩下的就是符合要求的:
SELECT * FROM your_table WHERE -- 排除全Listed的行 NOT (Column1 = 'Listed' AND Column2 = 'Listed' AND Column3 = 'Listed' AND Column4 = 'Listed') AND -- 排除全价格的行 NOT ( Column1 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' AND Column2 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' AND Column3 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' AND Column4 REGEXP '^\\(\\$[0-9]+\\.[0-9]{2}\\)$' );
关于价格格式的匹配说明
上面用的正则是针对($X.XX)这种格式的,不同数据库的正则语法可能有小差异:
- MySQL/MariaDB:用
REGEXP或RLIKE - PostgreSQL:用
~运算符,比如Column1 ~ '^\(\$[0-9]+\.[0-9]{2}\)$' - SQL Server:可以用
PATINDEX,比如PATINDEX('^($[0-9]+\.[0-9]{2})$', Column1) > 0
你可以根据自己使用的数据库调整这部分语法。
内容的提问来源于stack exchange,提问作者Gary Stewart
相关产品推荐
相关产品推荐

