Oracle 中 查询结果替换的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 中 查询结果替换的问题相关的知识,希望对你有一定的参考价值。

查询出的结果是:

name ID
A 1
B 2
C 3
D 4

我想 ID>=3 的 输出 高, ID《=2的 输出低

A 低
B 低
C 高
D 高

请问该如何写SQL?? 环境是ORACLE
谢谢热心解答,现在遇到一个新问题

组 数量 状态
A 1 1
A 1 2
A 1 3
C 1 1
C 2 2
C 3 3
C 4 4
现在需要按状态分组 “状态”大于2 的一组 小于等于2的一组; 组内数量求和

期望结果是
A 2 小
A 1 大
C 3 小
C 7 大

SELECT name, CASE WHEN ID>=3 THEN '高' ELSE '低' END
from tab

如果要你那个期望结果,必须要分开考虑。
SELECT 组, SUM(数量), MAX(CASE WHEN 状态 <= 2 THEN '小' ELSE NULL END)
FROM TAB WHERE 状态 <= 2 GROUP BY 组
union all
SELECT 组, SUM(数量), MAX(CASE WHEN 状态 > 2 THEN '大' ELSE NULL END)
FROM TAB WHERE 状态 > 2 GROUP BY 组
参考技术A select name, decode(sign(id - 3), -1, '低', '高') from table
ORACLE用sign 如果id = 3 ,得到的是0,大于得到1,小于得到-1

把上面得到的结果作为一个新表T,然后以T为基表去得到分组汇总
SELECT T.NAME, T.STATUS, SUM(T.NUMBER)
FROM (select name, decode(sign(status - 2), 1, '大', '小') AS STATUS, NUMBER from table) T
GROUP BY T.NAME, T.STATUS
参考技术B 1.SELECT name, decode(id>=2,'高' , '低' ) from tab;
2.SELECT 组,sum(数量),‘大’ from tab group by 组 having 状态>2
union
SELECT 组,sum(数量),‘小’ from tab group by 组 having 状态<=2
参考技术C l(col01, '空') -- SQL SERVER写法
select nvl(col01, '空')-- oracle写法

如果字段是空字符串' '
select replace(col01, ' ', '空')

从结果表中多选到oracle中的单行

【中文标题】从结果表中多选到oracle中的单行【英文标题】:Multiple select from a result table into a single row in oracle 【发布时间】:2016-01-11 05:43:00 【问题描述】:

我一直在努力寻找一种方法来用 SQL 命令中的内部选择替换多个 JOIN,但到目前为止还没有找到。我有一个连接 11 个表的查询,由于多个角色,我的查询中必须有 21 个连接。所以我决定在我的表格中找到更多信息,并发现我有一个表格,其中包含适当的信息来关联一些表格。 [我的结果表][1] 如您所见,我有一个名为“Mainuuid”的字段,它与不同的“从属”值相关。每个从属值都是其相对表中的主键。 所以我需要的是一个单行,它是根据结果图像从多项选择中计算出来的,例如:我将结果表命名为“test”

从 Id=test.slave 的人中选择 a,b, 从 ID=test.slave 的单元中选择 x,y,

SELECT o,p FROM naturalperson WHERE Id=test.slave

我想将所有结果放在一行中!任何建议将不胜感激。

[1]:http://i.stack.imgur.com/7pK2D.jpg

【问题讨论】:

我认为这就像扫描行并从相对表中查找所需字段并将获取的列添加到结果中等等。 【参考方案1】:

我真的不明白为什么你真的需要用嵌套的 SELECT 替换连接,但这是我的建议:

SELECT x.mainuuid, max(x.a),max(x.b),max(y.x),max(y.y),max(z.o),max(z.p)
FROM
(SELECT mainuuid, a,b
FROM person, test
WHERE Id=test.slave) x
(SELECT mainuuid, x,y
FROM Unit, test
WHERE Id=test.slave) y
(SELECT mainuuid, o,p
FROM naturalperson, test
WHERE Id=test.slave) z
WHERE x.mainuuid = y.mainuuid(+) 
AND x.mainuuid = z.mainuuid(+)
GROUP BY x.mainuuid;

我没有时间对此进行测试,但重点是,您使用 max 函数来消除空值并根据 mainuuid 从同一行的所有表中获取结果。 这是一个快速的答案 - 可能不是解决方案,但我希望它至少可以帮助您前进。

【讨论】:

我试过了,但你知道在第二次选择后,表格彼此不相关!第一个 FROM 发生在第一张桌子上,而不是其他人! 好的 - 我想我不明白你的问题。 :// 我要澄清一件事:您不能在不进行联接的情况下从多个表中选择数据。如果您忽略连接,数据库将进行交叉连接。【参考方案2】:

有更多方法可以实现,最直接的方法是:

SELECT (SELECT a FROM person WHERE Id=test.slave FETCH FIRST 1 ROW ONLY),
       (SELECT x FROM Unit WHERE Id=test.slave FETCH FIRST 1 ROW ONLY),
       (SELECT o FROM naturalperson WHERE Id=test.slave FETCH FIRST 1 ROW ONLY)

问题是,每个嵌套选择只能选择一个属性。 解决这个问题的方法是 OUTER APPLYCROSS APPLY,在 Oracle 版本 12C 中可用。

SELECT p.a, p.b, u.*, n.* 
FROM person p
OUTER APPLY (
  SELECT u1.x,u1.y FROM Unit u1 WHERE u1.Id=p.Id FETCH FIRST 1 ROW ONLY) u
OUTER APPLY (
  SELECT n1.o,n1.p FROM naturalperson n1 WHERE n1.Id=p.Id FETCH FIRST 1 ROW ONLY) n
WHERE p.Id=test.slave

对于旧版本的 Oracle,请使用 Lateral joins 和 WHERE ROWNUM=1 而不是 FETCH FIRST 1 ROW ONLY

【讨论】:

以上是关于Oracle 中 查询结果替换的问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 字符串拆分的查询的问题,急!!!

当行丢失时,用 Oracle SQL PIVOT 结果中的自定义值替换 NULL

从结果表中多选到oracle中的单行

使用 Oracle 替换变量进行查询

急!sqlserver查询结果按句号换行符

在 oracle 的 sql 查询中替换“过滤器”