简单实用的sql小技巧(第一篇) (r3笔记第36天)

今天和大家简单分享几个实用的sql小技巧。还有一些还在整理中,会不断的分享出来。 有些其实也不算是sql的技巧,可能大家在写sql语句的时候没有意识到我们可以通过一条sql语句实现一些貌似复杂的功能。

首先来创建测试用表。 create table test_obj as select *from dba_objects; 先随机抽出5条记录看看

set linesize 200 select object_id,object_name from test_obj where rownum<=5; OBJECT_ID OBJECT_NAME ---------- -------------------- 20 ICOL$ 46 I_USER1 28 CON$ 15 UNDO$ 29 C_COBJ#

SQL> / --再看一次结果

OBJECT_ID OBJECT_NAME ---------- -------------------- 20 ICOL$ 46 I_USER1 28 CON$ 15 UNDO$ 29 C_COBJ#

我们来随机的查看5条记录,这个对于数据的检查工作还是蛮有用的。 可以很明显的看到,两种情况显示的数据还是差别很大的。 select *from ( select object_id,object_name from test_obj order by dbms_random.value() ) where rownum<=5; OBJECT_ID OBJECT_NAME ---------- ------------------------------ 1635 V_$TIMER 9937 KU$_TAB_SUBPART_VIEW 4291 EXU10TAB 5559 USER_CHANGE_NOTIFICATION_REGS 13953 WRH$_LATCH_PK 还有一个是关于Null值的处理,如果查询的结果中含有Null值,能够统一的处理,是都显示在开头还是末尾。 因为数据量较大,所以看看如果Null值在最开头的情况。 select *from ( select object_id,object_name,object_type from test_obj order by object_id nulls first ) where rownum<10;

/

OBJECT_ID OBJECT_NAME OBJECT_TYPE ---------- ------------------------------ ------------------- TEST DATABASE LINK AAA DATABASE LINK 2 C_OBJ# CLUSTER 3 I_OBJ# INDEX 4 TAB$ TABLE 5 CLU$ TABLE 6 C_TS# CLUSTER 7 I_TS# INDEX 8 C_FILE#_BLOCK# CLUSTER 如果需要null值在末尾,则使用Nulls last 这个时候我们提高一个层次,比如我们已经知道有些列含有Null值,如果在输出结果排序的时候,如果object_type值是'DATABASE LINK'话,就按照object_name来排序,如果不是,则按照object_id来排序。 听起来这个写一个简单的sql语句还是蛮有难度的。 可以这样试试。

select *from ( select *from ( select object_id,object_name,object_type from test_obj order by object_id nulls first ) where rownum<10 ) order by case when object_type='DATABASE LINK' then object_name else object_id||'' end OBJECT_ID OBJECT_NAME OBJECT_TYPE ---------- ------------------------------ ------------------- 2 C_OBJ# CLUSTER 3 I_OBJ# INDEX 4 TAB$ TABLE 5 CLU$ TABLE 6 C_TS# CLUSTER 7 I_TS# INDEX 8 C_FILE#_BLOCK# CLUSTER AAA DATABASE LINK TEST DATABASE LINK 毕竟只要我们能够在满足业务而且性能影响不大的情况下,使用一条sql语句还是能够实现蛮多的复杂需求的。何乐而不为。 值得一提的是,如果在最后的部分,没有间接的对Object_id做类型的转换的话,会报如下的错误。所以可以做个小把戏,间接转换为char型。 ERROR at line 1: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

原来Oracle也不喜欢“蜀黍"(r6笔记第54天)

今天在部署一个脚本的时候,碰到了一个奇怪的问题,脚本运行过程中报了一个ora错误 ORA-01756: quoted string not properly t...

29150
来自专栏数据库新发现

字符集问题的初步探讨(二)

原文发表于itpub技术丛书《Oracle数据库DBA专题技术精粹》,未经许可,严禁转载本文.

14320
来自专栏乐沙弥的世界

SQL*Plus copy 命令处理大批量数据复制

    对于数据库表级上的数据复制,我们最常用的是CREATE TABLE AS(CTAS)..方式。其实在SQL*Plus下面copy命令可以完成同样的工作,...

13010
来自专栏deed博客

Oracle在Linux下安装

28620
来自专栏乐沙弥的世界

PL/SQL -->隐式游标(SQL%FOUND)

在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

11430
来自专栏菩提树下的杨过

mybatis 使用经验小结

一、多数据源问题 主要思路是把dataSource、sqlSesstionFactory、MapperScannerConfigurer在配置中区分开,各Map...

30360
来自专栏乐沙弥的世界

FORALL 之 SAVE EXCEPTIONS 子句应用一例

     对于大批量的DML操作中出现的错误,除了使用DML error logging特性来记录在DML期间出现的错误之外,使用批量SQL语句FORALL的S...

7610
来自专栏颇忒脱的技术博客

数据库时区那些事儿 - Oracle的时区处理

当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docke...

1.5K40
来自专栏杨建荣的学习笔记

巧用外部表避免大量的insert (r4笔记第71天)

昨天开发咨询我一个问题,希望我对下面的语句进行调优。 语句类似下面的形式 SELECT subscriber_no FROM SUBSCRIBER S W...

37480
来自专栏安恒网络空间安全讲武堂

Sqli_labs65关通关详解(上)

Less-1 这个题目是基于错误,单引号,字符型注入, http://127.0.0.1/sqli/Less-1/?id=1' //报错 http://...

74060

扫码关注云+社区

领取腾讯云代金券