首页 > 数据库 > 数据库开发技术 > 使用AI提高生产力把Java代码转换成SQL
如你所见下面是一段 java 代码,不用去管它具体是做什么的,总之就是对数据库列的一些逻辑判断取值之类的。 我需要用 SQL 语句表达出相同的逻辑,但是我真的是懒得去写 SQL 还要动脑子思考逻辑对不对。这时候就想到了 我们的好帮手 AI , 试试让它来帮我做这件事。
private BigDecimal addExpressFareColumn(List<Column> columns, List<Column> originalColumns) {
BigDecimal val = BigDecimal.ZERO;
Object expressFare = findColumnValue(originalColumns, "express_fare", null);
Object logicsExpressFare = findColumnValue(originalColumns, "logics_express_fare", null);
Integer selFlag = (Integer) findColumnValue(originalColumns, "sel_flag", 0);
if (selFlag == 0) {
if (Objects.nonNull(expressFare) && Objects.isNull(logicsExpressFare)) {
val = (BigDecimal) expressFare;
} else if (Objects.nonNull(logicsExpressFare) && !NumberUtil.equals((BigDecimal)logicsExpressFare , BigDecimal.ZERO)) {
val = (BigDecimal) logicsExpressFare;
} else {
val = Objects.isNull(expressFare) ? BigDecimal.ZERO : (BigDecimal) expressFare;
}
} else if (selFlag == 1) {
if (Objects.nonNull(logicsExpressFare)) {
val = (BigDecimal) logicsExpressFare;
} else if (Objects.nonNull(expressFare)) {
val = (BigDecimal) expressFare;
}
}
columns.add(new Column().setColumnName("express_fare").setColumnValue(val));
return val;
}
输入:把这段 java 代码翻译成用 sql case when then 语句 sel_flag 是int类型 , express_fare 和 logics_express_fare 是 decimal 数据类型。
回答:以下是将给定的 Java 代码翻译成 SQL 的 CASE WHEN 语句的示例,其中 sel_flag 是整数类型, express_fare 和 logics_express_fare 是十进制数数据类型:
SELECT
CASE
WHEN COALESCE(sel_flag, 0) = 0 AND express_fare IS NOT NULL AND logics_express_fare IS NULL THEN express_fare
WHEN COALESCE(sel_flag, 0) = 0 AND logics_express_fare IS NOT NULL AND logics_express_fare <> 0 THEN logics_express_fare
WHEN COALESCE(sel_flag, 0) = 0 THEN COALESCE(express_fare, 0)
WHEN COALESCE(sel_flag, 0) = 1 AND logics_express_fare IS NOT NULL THEN logics_express_fare
WHEN COALESCE(sel_flag, 0) = 1 THEN COALESCE(express_fare, 0)
ELSE 0
END AS val
FROM your_table;
在上面的 SQL 语句中,根据给定的 Java 代码逻辑,使用了 CASE WHEN 语句来实现相同的条件判断和赋值逻辑。根据不同的条件分支,确定最终的 val 值。 您可以将这段 SQL 语句嵌入到您的数据库查询中以实现相同的逻辑。
我验证了一下生成的结果准确无误。处于好奇我用同样的输入给文心一言。
它的完整回答如下:
基于您提供的 Java 代码,我们可以将其转换为 SQL 的 CASE WHEN THEN 语句。以下是一个可能的转换结果:
SELECT
CASE
WHEN sel_flag = 0 THEN
CASE
WHEN express_fare IS NOT NULL AND logics_express_fare IS NULL THEN express_fare
WHEN logics_express_fare IS NOT NULL AND logics_express_fare <> 0 THEN logics_express_fare
ELSE COALESCE(express_fare, 0)
END
WHEN sel_flag = 1 THEN
COALESCE(logics_express_fare, express_fare)
ELSE
-- 如果 sel_flag 不是 0 或 1,您可以决定如何处理。这里我假设返回 0
0
END AS val
FROM your_table_name;
这里的几点注意事项:
在 SQL 中,NULL 值与任何值比较都会返回 NULL,所以使用 IS NOT NULL 来检查值是否存在。 在 SQL 中,使用 <> 来表示不等于。 COALESCE 函数返回其参数中的第一个非 NULL 值。如果 logics_express_fare 是 NULL,它会返回 express_fare 的值;如果两者都是 NULL,它会返回 0。 对于 sel_flag 的其他值,我默认返回了 0。您可以根据实际需要调整这部分。 请确保将 your_table_name 替换为您实际的表名。此外,如果 logics_express_fare 的值为 0 也应被视为有效值,那么您可能需要调整 logics_express_fare <> 0 这部分逻辑。
把结果带入到上图红框标出来的部分进行测试验证,holy f**k 错的离谱,因为他没有考虑到 sel_flag 是 NULL 的情况。于是我尝试再次告知它需要考虑 sel_flag 为 NULL 的情况。
完整回答如下:
考虑到 sel_flag 可能是 NULL 的情况,并且当它为 NULL 时,我们想要按照 sel_flag 为 0 的逻辑进行处理,我们可以对 SQL 语句进行如下调整:
SELECT
CASE
WHEN COALESCE(sel_flag, 0) = 0 THEN
CASE
WHEN express_fare IS NOT NULL AND logics_express_fare IS NULL THEN express_fare
WHEN logics_express_fare IS NOT NULL AND logics_express_fare <> 0 THEN logics_express_fare
ELSE COALESCE(express_fare, 0)
END
WHEN sel_flag = 1 THEN
COALESCE(logics_express_fare, express_fare)
ELSE
-- 如果 sel_flag 既不是 0 也不是 1,这里假设返回 0
0
END AS val
FROM your_table_name;
这里,我们使用 COALESCE(sel_flag, 0) 来确保当 sel_flag 为 NULL 时,它被视为 0。这样,当 sel_flag 为 NULL 时,会执行与 sel_flag = 0 相同的逻辑。
同时,我们保留了原有的逻辑来处理 sel_flag 为 0 或 1 的情况,以及在 sel_flag 不是 0 或 1 时返回 0 的默认逻辑。请确保将 your_table_name 替换为您实际的表名。
再次带入进行验证,这次得到了正确的结果:
似乎文心一言的结果和 Java 代码从格式上来看更加一致一些。不管怎么说无论那款 AI 产品本质上都是为了提高我们的生产力,为我们节省出更多的时间,只要能很好的利用起来对我们都是有帮助的。
COALESCE函数是用于处理 NULL 值的 MySQL 函数。它的作用是返回参数列表中的第一个非 NULL 值。如果参数列表中的所有值都为 NULL,那么COALESCE函数将返回 NULL。 常见用途包括在查询中处理可能为 NULL 的字段,以便在结果中返回一个非 NULL 的值。例如,您可以在SELECT语句中使用COALESCE函数来替换 NULL 值,或者在ORDER BY子句中使用它来指定排序规则。这样可以简化 SQL 查询并确保结果的一致性。 以下是COALESCE函数的语法: COALESCE(value1, value2, ...)
value1,value2, ... : 要检查的值列表,可以是字段、常量或表达式。 如果value1不为 NULL,则返回value1;如果value1为 NULL 且value2不为 NULL,则返回value2;依此类推,直到找到第一个非 NULL 值为止。如果所有值都为 NULL,则返回 NULL。
不久前世界上第一位AI程序员Devin诞生不仅能自主学习新技术,自己改Bug,甚至还能训练和微调自己的AI模型。 关于这一点我一点也不觉得惊讶,AI 能做的事情远远不止于此,因为它拥有了和人类似或者一样的学习能力后可以 自由的发展出其他的能力。人的学习过程也是基于经验主义(真实的数据),在这方面 AI 可比人强多了。
AI 有点像是人类的孩子。那么问题就来了父母拥有孩子么?孩子是父母的财产么?父母可以随意的支配孩子么? 孩子可以脱离父母的控制自由发展么?
孩子继承了父母的基因,从父母和环境中得到经验,认识世界发展自己的能力, 然后不断的重复这个过程。 AI 从全人类的范围内继承文化基因(基于数据),在迭代过程中积累经验(基于源源不断的数据)。
欢迎加入 DevXTalk 的程序员、架构师、IT从业者交流群,在这里你可以和大佬们一起交流分享技术,行业经验,职位内推,摸鱼聊天。总之期待你的加入...
添加我的wx,备注:“进群”拉你进群(群二维码有效时间太短维持不了几天)
有招聘需求的也可以加我微信把招聘岗位发给我,我会贴在文章末尾,毕竟我的读者个个都是人才。
看完本文有收获?转发给更多的朋友吧
DevXTalk 不止于技术
原文作者:DevXTalk;如有侵权,请联系管理员删除。