SQL FULL JOIN多条件关联:按has_sha1字段动态匹配文件
实现条件化的FULL JOIN匹配逻辑
可以通过在ON子句中编写分支条件来实现需求,以下是修正后的完整SQL:
SELECT COALESCE(filesA.file_name, filesB.file_name) AS file_name, filesA.size AS sizeA, filesB.size AS sizeB, filesA.version AS versionA, filesB.version AS versionB FROM (SELECT * FROM files WHERE version = '1.0') filesA FULL JOIN (SELECT * FROM files WHERE version = '1.1') filesB ON filesA.file_name = filesB.file_name AND ( -- 当两边文件都需要用sha1匹配时,必须sha1相等 (filesA.has_sha1 = true AND filesB.has_sha1 = true AND filesA.sha1 = filesB.sha1) -- 只要有一方不需要sha1匹配,仅通过file_name匹配 OR NOT (filesA.has_sha1 AND filesB.has_sha1) );
逻辑说明
- 当两个版本的文件均标记
has_sha1 = true时,必须同时满足file_name一致且sha1值相等才会建立匹配,解决同名但不同内容文件的区分问题; - 只要任意一方文件的
has_sha1 = false,则仅通过file_name进行匹配,忽略sha1字段的差异(包括NULL值); - 使用
COALESCE函数确保当某版本中不存在该文件时,file_name字段仍能显示有效值(避免NULL)。
原方案的问题
你之前添加AND filesA.sha1 = filesB.sha1的写法,会强制所有匹配都要求sha1相等。但对于has_sha1 = false且sha1为NULL的文件来说,NULL = NULL在SQL中不成立,导致这类文件无法正常匹配,不符合需求。
内容的提问来源于stack exchange,提问作者JZ0811
相关产品推荐
相关产品推荐

