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

PostgreSQL 11.16中如何筛选不同版本间列数据类型的差异

问题分析与解决

你的SQL语句逻辑完全偏离需求,问题出在这几点:

  • DISTINCT ON (column_name, data_type)是对列名+数据类型的组合去重,它会把同一列、同一类型的重复记录合并,但你要找的是同一列在两个版本中类型不同的记录,这个逻辑不匹配。
  • 原语句没有做版本间的对比关联,只是简单合并D1、D2的记录后去重,无法精准筛选出类型变更的列。

正确的解决方法

方法1:自连接直接对比版本差异

通过将表自身连接,关联同一列名的D1和D2版本记录,筛选出类型不同的结果:

-- 获取变更列的两个版本类型对比
SELECT 
    d1.column_name,
    d1.versionsnummer AS d1_version,
    d1.data_type AS d1_data_type,
    d2.versionsnummer AS d2_version,
    d2.data_type AS d2_data_type
FROM mytable d1
JOIN mytable d2 
    ON d1.column_name = d2.column_name
    AND d1.versionsnummer = 'D1'
    AND d2.versionsnummer = 'D2'
WHERE d1.data_type != d2.data_type;

如果需要获取变更列的两条原始记录,可以用子查询先定位变更列,再取出对应数据:

-- 获取变更列的两个版本原始记录
SELECT *
FROM mytable
WHERE column_name IN (
    SELECT d1.column_name
    FROM mytable d1
    JOIN mytable d2 
        ON d1.column_name = d2.column_name
        AND d1.versionsnummer = 'D1'
        AND d2.versionsnummer = 'D2'
    WHERE d1.data_type != d2.data_type
)
AND versionsnummer IN ('D1', 'D2');

方法2:分组筛选多类型列

先分组统计每个列在D1、D2版本中的不同类型数量,筛选出数量大于1的列(即类型变更的列),再取出对应记录:

SELECT column_name, versionsnummer, data_type
FROM mytable
WHERE versionsnummer IN ('D1', 'D2')
AND column_name IN (
    SELECT column_name
    FROM mytable
    WHERE versionsnummer IN ('D1', 'D2')
    GROUP BY column_name
    HAVING COUNT(DISTINCT data_type) > 1
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:32:32