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

基于条件与值输出列名的SQL实现问题

解决方法:找出在data=x和data=y行中均为'yes'的列名

首先得指出你当前代码里的核心问题:你的每个SELECT语句里写了data=y and data=x,这是矛盾的——一行数据的data列不可能同时等于两个不同的值,所以这个条件永远不会满足,自然查不到任何结果。

下面给你几种可行的修正方案,你可以根据自己的数据库类型和列的数量来选择:

方案1:用EXISTS子查询(适合列数量较少的场景)

这个方法逻辑最直观,针对每个列分别检查:是否存在data='x'且该列是'yes'的行,同时存在data='y'且该列是'yes'的行。

SELECT 'A' AS column_name
FROM world.city
WHERE EXISTS (SELECT 1 FROM world.city WHERE data = 'x' AND A = 'yes')
  AND EXISTS (SELECT 1 FROM world.city WHERE data = 'y' AND A = 'yes')

UNION ALL

SELECT 'B' AS column_name
FROM world.city
WHERE EXISTS (SELECT 1 FROM world.city WHERE data = 'x' AND B = 'yes')
  AND EXISTS (SELECT 1 FROM world.city WHERE data = 'y' AND B = 'yes')

UNION ALL

SELECT 'C' AS column_name
FROM world.city
WHERE EXISTS (SELECT 1 FROM world.city WHERE data = 'x' AND C = 'yes')
  AND EXISTS (SELECT 1 FROM world.city WHERE data = 'y' AND C = 'yes')

UNION ALL

SELECT 'D' AS column_name
FROM world.city
WHERE EXISTS (SELECT 1 FROM world.city WHERE data = 'x' AND D = 'yes')
  AND EXISTS (SELECT 1 FROM world.city WHERE data = 'y' AND D = 'yes');

方案2:用条件聚合(通用型,支持大多数数据库)

通过聚合函数分别提取data='x'和data='y'时各列的值,再判断是否都是'yes':

SELECT column_name
FROM (
    -- 检查列A
    SELECT
        CASE 
            WHEN MAX(CASE WHEN data = 'x' THEN A END) = 'yes' 
             AND MAX(CASE WHEN data = 'y' THEN A END) = 'yes' 
            THEN 'A' 
        END AS column_name
    FROM world.city
    
    UNION ALL
    
    -- 检查列B
    SELECT
        CASE 
            WHEN MAX(CASE WHEN data = 'x' THEN B END) = 'yes' 
             AND MAX(CASE WHEN data = 'y' THEN B END) = 'yes' 
            THEN 'B' 
        END AS column_name
    FROM world.city
    
    UNION ALL
    
    -- 检查列C
    SELECT
        CASE 
            WHEN MAX(CASE WHEN data = 'x' THEN C END) = 'yes' 
             AND MAX(CASE WHEN data = 'y' THEN C END) = 'yes' 
            THEN 'C' 
        END AS column_name
    FROM world.city
    
    UNION ALL
    
    -- 检查列D
    SELECT
        CASE 
            WHEN MAX(CASE WHEN data = 'x' THEN D END) = 'yes' 
             AND MAX(CASE WHEN data = 'y' THEN D END) = 'yes' 
            THEN 'D' 
        END AS column_name
    FROM world.city
) AS subquery
WHERE column_name IS NOT NULL;

方案3:用UNPIVOT(适合列数量多的场景,部分数据库支持)

如果你的数据库支持UNPIVOT(比如SQL Server、Oracle),可以把列转成行,再分组统计,这样不用重复写每个列的逻辑:

SELECT DISTINCT column_name
FROM (
    -- 把列A/B/C/D转成行数据
    SELECT data, column_name, column_value
    FROM world.city
    UNPIVOT (
        column_value FOR column_name IN (A, B, C, D)
    ) AS unpivoted_data
) AS transformed
-- 筛选data是x或y,且值为yes的记录
WHERE data IN ('x', 'y') AND column_value = 'yes'
-- 分组后检查是否同时包含x和y的记录
GROUP BY column_name
HAVING COUNT(DISTINCT data) = 2;

内容的提问来源于stack exchange,提问作者S. Farooq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:19