如何对比link_name列中两个资产ID对应的voltage值是否一致?
解决方案
假设存储link_name的表名为link_table,主资产表名为assets(包含asset_id和voltage字段),以下分主流数据库给出实现方式:
MySQL 实现
SELECT link_name, a1.asset_id AS asset_id1, a1.voltage AS voltage1, a2.asset_id AS asset_id2, a2.voltage AS voltage2, -- 浮点型电压需考虑精度误差,用差值判断近似匹配 CASE WHEN ABS(a1.voltage - a2.voltage) < 0.001 THEN '匹配' ELSE '不匹配' END AS match_result FROM link_table -- 提取第一个资产ID并关联主表 JOIN assets a1 ON a1.asset_id = CAST(SUBSTRING_INDEX(REPLACE(REPLACE(link_name, '(', ''), ')', ''), '_', 1) AS UNSIGNED) -- 提取第二个资产ID并关联主表 JOIN assets a2 ON a2.asset_id = CAST(SUBSTRING_INDEX(REPLACE(REPLACE(link_name, '(', ''), ')', ''), '_', -1) AS UNSIGNED);
PostgreSQL 实现
SELECT link_name, a1.asset_id AS asset_id1, a1.voltage AS voltage1, a2.asset_id AS asset_id2, a2.voltage AS voltage2, CASE WHEN ABS(a1.voltage - a2.voltage) < 0.001 THEN '匹配' ELSE '不匹配' END AS match_result FROM link_table JOIN assets a1 ON a1.asset_id = CAST(split_part(regexp_replace(link_name, '[()]', '', 'g'), '_', 1) AS INTEGER) JOIN assets a2 ON a2.asset_id = CAST(split_part(regexp_replace(link_name, '[()]', '', 'g'), '_', 2) AS INTEGER);
关键说明
- 先通过字符串函数清理
link_name:移除括号,按下划线分割出两个资产ID; - 若资产ID是数字类型,需用
CAST转换类型,避免字符串关联的性能损耗; - 若
voltage是浮点型(如DECIMAL、FLOAT),禁止直接用=判断,建议通过差值绝对值小于极小值(如0.001)验证近似匹配,规避精度误差导致的误判; - 若存在资产ID不在主表的场景,可将
JOIN改为LEFT JOIN,并在结果中标记缺失的资产。
内容的提问来源于stack exchange,提问作者KillerBot Sxp
相关产品推荐
相关产品推荐

