You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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时,结果如下:

IDfield_namefield_value
1field11
1field31

这种方式的好处是不用考虑数据库差异,逻辑直观,后续处理数据也很方便。

方案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

返回结果完全符合你的要求:

IDfield1field3
111

注意事项:

  • 不同数据库的动态SQL语法不一样:比如SQL Server用EXEC sp_executesql,Oracle用EXECUTE IMMEDIATE,需要根据你的数据库调整。
  • 如果target_id是用户输入的参数,一定要做参数化处理,避免SQL注入风险。

内容的提问来源于stack exchange,提问作者Erik Chau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:37:06