LeetCode_sql_day21(1440.计算布尔表达式的值)

描述:

Variables:

复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| name          | varchar |
| value         | int     |
+---------------+---------+
在 SQL 中,name 是该表主键.
该表包含了存储的变量及其对应的值.

Expressions:

复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| left_operand  | varchar |
| operator      | enum    |
| right_operand | varchar |
+---------------+---------+
在 SQL 中,(left_operand, operator, right_operand) 是该表主键.
该表包含了需要计算的布尔表达式.
operator 是枚举类型, 取值于('<', '>', '=')
left_operand 和 right_operand 的值保证存在于 Variables 表单中.

计算表 Expressions 中的布尔表达式。

返回的结果表 无顺序要求

结果格式如下例所示。

示例 1:

复制代码
输入:
Variables 表:
+------+-------+
| name | value |
+------+-------+
| x    | 66    |
| y    | 77    |
+------+-------+

Expressions 表:
+--------------+----------+---------------+
| left_operand | operator | right_operand |
+--------------+----------+---------------+
| x            | >        | y             |
| x            | <        | y             |
| x            | =        | y             |
| y            | >        | x             |
| y            | <        | x             |
| x            | =        | x             |
+--------------+----------+---------------+

输出:
+--------------+----------+---------------+-------+
| left_operand | operator | right_operand | value |
+--------------+----------+---------------+-------+
| x            | >        | y             | false |
| x            | <        | y             | true  |
| x            | =        | y             | false |
| y            | >        | x             | true  |
| y            | <        | x             | false |
| x            | =        | x             | true  |
+--------------+----------+---------------+-------+
解释:
如上所示, 你需要通过使用 Variables 表来找到 Expressions 表中的每一个布尔表达式的值.

数据准备:

sql 复制代码
Create Table If Not Exists Variables (name varchar(3), value int)
Create Table If Not Exists Expressions (left_operand varchar(3), operator ENUM('>', '<', '='), right_operand varchar(3))
Truncate table Variables
insert into Variables (name, value) values ('x', '66')
insert into Variables (name, value) values ('y', '77')
Truncate table Expressions
insert into Expressions (left_operand, operator, right_operand) values ('x', '>', 'y')
insert into Expressions (left_operand, operator, right_operand) values ('x', '<', 'y')
insert into Expressions (left_operand, operator, right_operand) values ('x', '=', 'y')
insert into Expressions (left_operand, operator, right_operand) values ('y', '>', 'x')
insert into Expressions (left_operand, operator, right_operand) values ('y', '<', 'x')
insert into Expressions (left_operand, operator, right_operand) values ('x', '=', 'x')

分析:

①观察两个表 不妨将x和y的值 都加到expressions表中

此时就需要使用两个左连接

复制代码
select left_operand,v1.value as l,operator,right_operand ,v2.value as r
from Expressions left join Variables v1 on Expressions.left_operand = v1.name
                 left join Variables v2 on Expressions.right_operand = v2.name

②使用case when 根据操作符operator 列 判断 l 和 r 列值大小 并赋true 和false

复制代码
select
    left_operand,
    operator,
    right_operand,
             case
             when operator = '>' then if(l > r,'true','false')
             when operator = '<' then if(l < r,'true','false')
             when operator = '=' then if(l = r,'true','false')
         end value
    from t1;

代码:

sql 复制代码
with t1 as (
select left_operand,v1.value as l,operator,right_operand ,v2.value as r
from Expressions left join Variables v1 on Expressions.left_operand = v1.name
                 left join Variables v2 on Expressions.right_operand = v2.name)
select
    left_operand,
    operator,
    right_operand,
             case
             when operator = '>' then if(l > r,'true','false')
             when operator = '<' then if(l < r,'true','false')
             when operator = '=' then if(l = r,'true','false')
         end value
    from t1;

总结:

① 一开始走了一些弯路 将两个值连接后 用concat 连接 判断值 后来发现都是true

原因 是 concat连接的都当成字符串 无法计算

② case when 可以用两种解法

解法一:

找出所有true 的条件 然后 else false

case when operator = '>' and l>r then 'true'

when operator = '<' and l<r then 'true'

when operator = '=' and l=r then 'true'

else 'false' end

解法二:

另外一种就是上述代码中 then里面加个if判断 很巧妙 之前没用过

相关推荐
hh随便起个名27 分钟前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
程序员爱钓鱼1 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder1 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL2 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码2 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_2 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy3 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌3 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
sg_knight3 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm