SQL 解码 - 选择和位置

标签 sql oracle select where decode

我有一个查询,我认为需要像这样(解码会更大)

SELECT
 firstName,
 lastName,
 decode(mathMrk, 80, 'A', mathMrk) as decodeMath,
 decode(engMrk, 80, 'A', engMrk) as decodeEng,
FROM table
WHERE
 decode(mathMrk, 80, 'A', mathMrk) IN ('A','B','C')
OR decode(engMrk, 80, 'A', engMrk) IN ('A','B');

或者可能在哪里?

WHERE
decodeMath IN ('A','B','C')
OR decodeEng IN ('A','B');

目标是以某种格式获得所有学生的分数,但如果说用户希望看到英语只有“A”或数学只有“A”的学生(根据选择和原因哪里)他们只看到那些学生 - 但所有相关的标记

基本上问题是:如果我在 SELECT 中解码和别名,我是否也需要在 WHERE 中解码? 如果我转换用户选择以匹配数据库而不是尝试解码会更好吗?尽管我的数据库有两种不同类型的数据作为标记,但我正在尝试将其转换为一种不同的类型,这也是用户从中选择的类型。

最佳答案

将其包装到 CASE 子句中。您还可以在 WHERE 子句中使用 CASE。

这是一个(简单的)工作示例,应该在任何 Oracle 架构上运行。
对于此示例,我将 object_id 转换为从 1 到 100 的等级。

with grades as
        (select object_name as student,
                mod (object_id, 99) + 1 as mathmark,
                case
                   when mod (object_id, 100) + 1 between 0 and 20 then 'F'
                   when mod (object_id, 100) + 1 between 21 and 40 then 'D'
                   when mod (object_id, 100) + 1 between 41 and 60 then 'C'
                   when mod (object_id, 100) + 1 between 61 and 80 then 'B'
                   when mod (object_id, 100) + 1 between 81 and 100 then 'A'
                end
                   as mathdecode
           from user_objects)
select *
  from grades
 where mathdecode in ('A', 'B')

关于SQL 解码 - 选择和位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889691/

相关文章:

mysql - SQL查询: How to Get tweet from following?

javascript - 具有默认值的 SQLite 数据库

oracle - oracle中.pls和.sql文件的实际区别

mysql - SQL 语句读取 mySQL 数据库中 >1000 个值

mysql - MySql 中的简单搜索

mysql - 这个带有 HAVING MAX 的查询实际上如何正确工作?

mysql - SQL/mysql - 如何显示 1 个表中具有不同值的两列

mysql - 如何在 SQL 中创建前 5 列和后 5 列?

database - 如何将 R 连接到 Oracle?

oracle - 编译无效的 oracle 程序