如何编写SQL查询筛选指定ID记录中值为1的列
解决方案:根据ID返回仅含值为1的列
嘿,这个需求我之前帮人处理过——SQL默认是返回固定列结构的,要实现只展示指定ID里值为1的列,得看你想要哪种结果形式,我给你两种实用的方案:
首先先明确你的表结构(我把它写成可执行的SQL方便测试):
CREATE TABLE your_table ( ID INT, field1 INT, field2 INT, field3 INT, field4 INT ); INSERT INTO your_table VALUES (1, 1, 0, 1, 0), (2, 0, 1, 0, 1);
方案1:通用键值对形式(兼容所有数据库)
如果不需要严格的固定列结构,这种方式最简单,返回ID、字段名、字段值的格式,自动过滤掉值为0的字段:
SELECT ID, 'field1' AS field_name, field1 AS field_value FROM your_table WHERE ID = 1 AND field1 = 1 UNION ALL SELECT ID, 'field2' AS field_name, field2 AS field_value FROM your_table WHERE ID = 1 AND field2 = 1 UNION ALL SELECT ID, 'field3' AS field_name, field3 AS field_value FROM your_table WHERE ID = 1 AND field3 = 1 UNION ALL SELECT ID, 'field4' AS field_name, field4 AS field_value FROM your_table WHERE ID = 1 AND field4 = 1;
当ID=1时,结果如下:
| ID | field_name | field_value |
|---|---|---|
| 1 | field1 | 1 |
| 1 | field3 | 1 |
这种方式的好处是不用考虑数据库差异,逻辑直观,后续处理数据也很方便。
方案2:动态列形式(严格匹配你要的固定列结果)
如果必须返回像你示例里的固定列结构,就得用动态SQL——也就是先根据ID查询出值为1的列名,再拼接成最终的查询语句。下面以MySQL为例:
-- 先指定要查询的ID SET @target_id = 1; SET @dynamic_sql = NULL; -- 拼接出需要保留的列名 SELECT GROUP_CONCAT( CASE WHEN field_value = 1 THEN CONCAT('`', field_name, '`') END ) INTO @dynamic_sql FROM ( SELECT ID, 'field1' AS field_name, field1 AS field_value FROM your_table WHERE ID = @target_id UNION ALL SELECT ID, 'field2' AS field_name, field2 AS field_value FROM your_table WHERE ID = @target_id UNION ALL SELECT ID, 'field3' AS field_name, field3 AS field_value FROM your_table WHERE ID = @target_id UNION ALL SELECT ID, 'field4' AS field_name, field4 AS field_value FROM your_table WHERE ID = @target_id ) temp_table WHERE field_value = 1; -- 组装最终的查询SQL SET @dynamic_sql = CONCAT('SELECT ID, ', @dynamic_sql, ' FROM your_table WHERE ID = ', @target_id); -- 执行动态SQL PREPARE stmt FROM @dynamic_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
当@target_id=1时,生成的实际SQL是:
SELECT ID, `field1`, `field3` FROM your_table WHERE ID = 1
返回结果完全符合你的要求:
| ID | field1 | field3 |
|---|---|---|
| 1 | 1 | 1 |
注意事项:
- 不同数据库的动态SQL语法不一样:比如SQL Server用
EXEC sp_executesql,Oracle用EXECUTE IMMEDIATE,需要根据你的数据库调整。 - 如果
target_id是用户输入的参数,一定要做参数化处理,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Erik Chau
相关产品推荐
相关产品推荐

