为何identifiants表check列全返回FALSE?跨表id验证求解决
解决自定义列全为FALSE的问题
以下是逐步排查和解决的方法:
1. 核对数据类型是否一致
- 必须保证
identifiants.id和informations.information id的数据类型完全匹配。比如一个是整数INT,另一个是字符串VARCHAR,哪怕数值一样,也会因为类型不匹配导致判断失败。 - 可以用类型转换统一后再判断,比如把整数转成字符串:
CAST(identifiants.id AS VARCHAR),再和informations.information id对比。
2. 检查数据是否含空格或特殊字符
- 很多时候是
informations.information id里的内容带了前导/尾随空格,或者不可见的特殊字符(比如换行、制表符),导致看起来一样的ID实际不匹配。 - 可以用去除空格的函数验证:
如果这条查询能查到结果,说明原数据有空格问题,修改自定义列逻辑时加上SELECT * FROM informations WHERE TRIM(`information id`) = '你确认存在的ID值';TRIM即可。
3. 确认自定义列的逻辑是否正确
- 以SQL为例,正确的自定义列创建逻辑应该是这样的:
要是你的逻辑里子查询没正确关联两张表,或者写法有误,就会导致全返回FALSE。ALTER TABLE identifiants ADD COLUMN check BOOLEAN GENERATED ALWAYS AS (EXISTS(SELECT 1 FROM informations WHERE informations.`information id` = identifiants.id)) STORED;
4. 处理NULL值的影响
- 如果某列存在NULL值,用
= NULL判断会返回UNKNOWN,最终被当成FALSE处理。 - 可以用
COALESCE函数把NULL替换成空字符串再判断:EXISTS(SELECT 1 FROM informations WHERE COALESCE(informations.`information id`, '') = COALESCE(identifiants.id, ''))
5. 手动验证数据匹配情况
- 先找一个你确定两边都存在的ID,分别执行下面的查询:
如果两个查询都返回结果,但自定义列还是FALSE,那问题出在自定义列的逻辑上;如果其中一个没返回,那就是数据本身的问题。SELECT * FROM informations WHERE `information id` = '目标ID值'; SELECT * FROM identifiants WHERE id = '同一个ID值';
内容的提问来源于stack exchange,提问作者Mourad BENKDOUR
相关产品推荐
相关产品推荐

