社区
Oracle
帖子详情
ORACLE的WHERE条件中加判断如何处理?
岁月明灯
2017-12-09 11:22:41
请教大家一个问题,我在oracle的SQL语句where 条件里想做个判断:
如果ta.orderno 为空, 则不加判断条件;
如果ta.orderno不为空,则加上 ta.orderno = tc.orderno
这个想加在where条件里怎么处理?
...全文
2404
5
打赏
收藏
ORACLE的WHERE条件中加判断如何处理?
请教大家一个问题,我在oracle的SQL语句where 条件里想做个判断: 如果ta.orderno 为空, 则不加判断条件; 如果ta.orderno不为空,则加上 ta.orderno = tc.orderno 这个想加在where条件里怎么处理?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AHUA1001
2020-11-09
打赏
举报
回复
用OR,肯定可以实现功能,但是大概率是不走索引的。
建议这样试试看:
where tc.orderno = nvl(ta.orderno,tc.orderno)
ClearlightY
2020-11-09
打赏
举报
回复
查到重复数据后, 查的时候加上 distinct 就好了
自由自在_Yu
2017-12-12
打赏
举报
回复
where ta.orderno = tc.orderno or ta.orderno is null
碧水幽幽泉
2017-12-09
打赏
举报
回复
where ta.orderno is null or ta.orderno = tc.orderno
卖水果的net
2017-12-09
打赏
举报
回复
ta.orderno = tc.orderno or ta.orderno is null
oracle
存储过程
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个: 第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。 第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。 第三、有利于SQL语句的重用。
oracle
存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct
where
xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF
判断
IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP;
PL/SQL 基础.doc
PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1.
Oracle
应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和数据库打交道的方法,和Pro*C很相似,更底层,很少用 只适合
ORACLE
; 4) SQLJ: 很新的一种用Java访问
Oracle
数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合
ORACLE
; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化
处理
的语言; 2)
Oracle
客户端工具访问
Oracle
服务器的操作语言; 3)
Oracle
对SQL的扩充; 4. PL/SQL的优缺点 优点:1) 结构化模块化编程,不是面向对象; 2) 良好的可移植性(不管
Oracle
运行在何种操作系统); 3) 良好的可维护性(编译通过后存储在数据库里); 4) 提升系统性能; 缺点 1) 不便于向异构数据库移植应用程序(只能用于
Oracle
); 5. SQL与PL/SQL的区别 SQL:1) 第四代语言(智能语言); 2) 做什么,不管怎么做; 3) 缺少过程与控制语句; 4) 无算法 PL/SQL: (相对SQL扩展部分) 1) 扩展变量和类型; 2) 扩展控制结构; 3) 扩展过程与函数; 4) 扩展对象类型与方法 ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) 执行部分, BEGIN <---------> END; 3) 异常
处理
,EXCEPTION(可以没有); 2. PL/SQL开发环境 可以运用任何纯文本的编辑器编辑,例如:VI 3. PL/SQL字符集 字母: A-Z, a-z; 数字: 0-9; 空白: TAB , SPACE , 回车; 符号: +_)(*&^%$#@!~ ; PL/SQL对大小写不敏感(注意) 4. 标识符命名规则答: 1) 字母开头; 2) 后跟任意的 非空格字符 数字 货币符号( $ ) 下划线( _ ) 或 # ; 3) 最大长度为30个字符(八个字符左右最合适); 用来给对象命名(潜规则): 变量: 以v_开头 游标: 以c_开头 类型: 子程序: 5. 分界符 1) 运算符 + - * / **(指数操作符) 2) 关系 =(相当于JAVA中的==) > < <> != ~= ^= <= >= 3) 赋值 := 例子a:=2 4) 连接 || 例: 'abc' || 123 5) 标号 << 需要的标记 >> 6) 注释 --(单行) /* */(段落) 7) 替代
6. 文字 1)字符型文字(字符串) 'tom' (单引号) 'tom''s pen' ''为2个单引号(标识转义) 为tom's pen 2)数字型 123 -4 +56 0 9.0 1.23E5 9.8e-3 3)布尔型 TRUE FALSE NULL 7. 变量声明 语法 Var_name [CONSTANT](标识常量,可选) type [NOT NULL](标识为not-null后必须在后面初始化) [:=value](赋值,初始化); Var_name [CONSTANT](标识常量,可选) type [NOT NULL] [ default value](赋值,初始化)等同于上面的语句; 注:1) 申明时可以有默认值也可以没有; 2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 3) 赋值语句为“:=”; 4) 变量可以认为是数据库里一个字段; 5) 规定没有初始化的变量为NULL; ---- 第三章 变量与数据类型 ---- 1. 数据类型 1) 标量型:数字型(BINARY_INTEGER,NUMBER)(DEC,FLOAT,REAL... NUMBER的子类型)、 NUMBER(P,S) P:精度:整个的有效数位(从左边开始第一个不为0的数字起) S:刻度,可选(小数点后面的保留位数) BINARY_INTEGER:保存整数. 和NUMBER的底层的保存方式不同, BINARY_INTEGER为2进制保存,NUMBER 需要考虑其他东西不是2进制方式 BINARY_INTEGER之间做加法效率快而NUMBER要先转换2进制再计算 单纯的计算---->BINARY_INTEGER 考虑和表中其他数据的交互的话一般------->NUMBER 字符型、CHAR VARCHAR VARCHAR2 STRING LONG 一般CHAR VARCHAR2就够了 CHAR 定长(例子:CHAR(5) 如果不够5个字符的话就会用空白填充 ) ,可以不带长度规定(默认为1) VARCHAR2 变长((VARCHAR2(5)标识最长可以保存5个字符) 后面的长度规定必须要有 布尔型、BOOLEAN 日期型; DATE(后增加 TIMESTAMP(比DATE更精细点(精确到秒) INTERVAL) 一般用DATE 2) 组合型:RECORD(常用)、TABLE(常用)、VARRAY(较少用) 3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [变量名] [表名.字段名] [%TYPE] 表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE; 3. RECORD类型 TYPE t_emp IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/ field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/ field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/ ... /*所有没有初始化的字段都会初始为NULL*/ fieldn type [NOT NULL][:=exprn] ); 4. %ROWTYPE 返回一个基于数据库定义的类型 DECLARE v_emp s_emp%ROWTYPE; /*s_emp为表的名字*/ 注:与RECORD类型中定一个record相比,一步就完成, 而RECORD类型中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量; 可以代替RECORD类型. 5. TABLE类型 TYPE tabletype IS TABLE OF type(类型名,要保存成的数据类型) INDEX BY BINARY_INTEGER; 例:DECLARE TYPE t_emp IS TABLE OF s_emp%ROWTYPE INDEX BY BINARY_INTERGER; v_emp t_emp; BEGIN SELECT * INTO v_emp(100) FROM s_emp
WHERE
id = 1; SELECT * INTO v_emp(200) FROM s_emp
WHERE
id = 2; DBMS_OUTPUT.PUT_LINE(v_emp(200).id||' '||v_emp(200).lastname||' '||v_emp(200).salary); END; 注:1) id(索引) 的数目的限制由BINARY_INTEGER的范围决定(-2147483647<----->2147483647); 2) TABLE类型与map
类似; 3) 表中的元素可以是复合类型; 4) KEY 没有必要是顺序的; 5) 当数据被插入表中的时候,表所需的空间就被分配了; 6. 变量的作用域和可见性 <
> 1) 执行块里可以嵌入执行块; 2) 里层执行块的变量对外层不可见; 3) 里层执行块对外层执行块变量的修改会影响外层块变量的值 (在此里层,对其他里层则不影响,想要不影响此里层的话可以使用标号标注外层); ---- 第四章 PL/SQL控制语句 ---- 1.
条件
语句 IF boolean_expression1(
条件
1) THEN ... ELSIF boolean_expression2(
条件
2) THEN /*注意是ELSIF,而不是ELSEIF*/ ... /*ELSE语句(ELSIF)不是必须的,但END IF;是必须的*/ ELSE ... END IF; 注意:1)有多个BOOLEAN表达式时候 AND(与),OR(或),NOT(非) 2)
条件
为FALSE与TRUE 相同; 2. 循环语句 1) Loop 循环 Loop ... (循环体) IF boolean_expr(
条件
) THEN /* 加
条件
语句,当满足
条件
时候退出循环*/ EXIT; /* EXIT WHEN boolean_expr */ END IF; END LOOP; 2) WHILE 循环 WHILE boolean_expr(
条件
) LOOP /* boolean_expr 循环
条件
*/ ... (循环体) END LOOP; 3) FOR循环 FOR loop_counter IN [REVERSE] low_bound..high_bound LOOP /* 范围中间用2个点表示 从 low_blound 到 high_bound */ ... (循环体) END LOOP; 例: FOR v_cnt IN 1..5 LOOP SELECT * INTO v_emp FROM s_emp
WHERE
id = v_cnt; 注:a. 加上REVERSE关键字 表示递减,从结束边界到起始边界,递减步长为一; 不加为递增,从起始边界到结束边界,递减步长为一; b. low_blound 起始边界; high_bound 结束边界; 3. GOTO语句 GOTO label_name; 1) 只能由内部块跳往外部块; 2) 设置标签:<< >> 3) 示例: LOOP ... IF D%ROWCOUNT = 50 THEN GOTO l_close; END IF; ... END LOOP; <
>: ... 4. NULL语句 在语句块
中加
空语句,用于补充语句的完整性。 例:IF boolean_expr THEN ... ELSE NULL; END IF; 5. SQL in PL/SQL 1) 只有DML SQL和transaction Control SQL可以直接在PL/SQL中使用; 2) PL/SQL中的动态SQL可以使用所有有效的SQL语句,包括DDL; 3) 动态SQL在运行时动态生成SQL语句,然后分析语句并执行; 4) PL/SQL中的动态SQL有两种:本地动态SQL和DBMS_SQL包; ---- 第五章 PL/SQL游标 ---- 1. 游标(CURSOR) 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数 据指针,在初始状态下指向的是首记录,利用 fetch 语句可以移动该指针,从而对游标中的数 据进行各种操作,然后将操作结果写回数据表中。 1)分类: a)显式游标:程序员可以操作控制,是针对select 语句的,指向select 语句的结束集 b)隐式游标:程序员不可控制,但可以有限制的应用 2)作用:用于
处理
查询语句的结果,提取多行数据集; 3)使用步骤: a) 声明游标: a. 普通声明: DELCARE v_emp s_emp%ROWTYPE; v_did s_dept.id%TYPE; CURSOR cur_emp IS select * FROM s_emp
WHERE
dept_id =v_did; /* CURSOR的内容必须是一条查询语句 */ b. 带参数声明明:DELCARE CURSOR c_emp(v_did s_emp.ID%TYPE) SELECT * FROM s_emp
WHERE
dept_id = v_did; b) 为查询打开游标: OPEN cur_emp; /* 相当于执行select语句,且把执行结果存入CURSOR; c) 从游标中取结果,存入PL/SQL变量中: a. FETCH cur_emp INTO var1, var2, ...(变量名 1, 变量名 2,.......); /* 变量的数量、类型、顺序要和Table中字段一致; */ b. FETCH cur_emp INTO record_var(记录型变量名); 注:将值从CURSOR取出放入变量中,每FETCH一次取一条记录; d) 关闭游标: CLOSE cur_emp; 注:a. 游标使用后应该关闭; b. 关闭后的游标不能FETCH和再次CLOSE; c. 关闭游标相当于将内存中CURSOR的内容清空; 2. 游标的属性 游标名%属性名 1) %FOUND: 是否有值; 有则返回TRUE,否则返回FALSE; 2) %NOTFOUND: 是否没有值; 如果没有值则返回TRUE,否则返回FALSE; 3) %ISOPEN: 是否是处于打开状态; 处于打开状态就返回TRUE,否则返回FALSE; 4) %ROWCOUNT: CURSOR当前的记录号(当前游标的指针位移量,表示在此之前,游标所
处理
的数据量(多少条记录)); 3. 游标的FETCH循环 1) LOOP FETCH 游标名 INTO 定义的变量 EXIT WHEN 游标名%NOTFOUND; /* 当游标没取道记录后退出 要及时的做出
判断
*/ END LOOP; 2) WHILE 游标名%FOUND LOOP FETCH 游标名 INTO 定义的变量; END LOOP; 3) FOR 保存数据的变量(不用事先定义,是根据游标声明的时候SELECT 的类型来确定) IN 游标名 LOOP (FETCH 游标名 INTO ...) (可以不用FETCH 语句) END LOOP; 4.带参数的游标CURSOR DECLARE v_emp s_emp%ROWTYPE CURSOR cur_emp(p_did s_emp.dept_id%TYPE) IS /* 定义参数p_did的类型 */ SELECT * FROM s_emp
WHERE
dept_id= p_did FOR UPDATE OF salary; /*FOR UPDATE OF salary; 加行级锁,在我修改这些数据的时候, *其他人无法修改数据,直到游标被CLOSE后 */ BEGIN OPEN cur_emp(31); /*带的参数值 31 就是赋给参数p_did 的 */ LOOP FETCH cur_emp INTO v_emp; EXIT WHEN cur_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name); END LOOP; CLOSE cur_emp; END 5.显式游标主要是用于对查询语句的
处理
,尤其是在查询结果为多条记录的情况下; 而对于非查询语句,如修改、删除操作,则由
ORACLE
系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由
ORACLE
系统定义的。 对于隐式游标的操作,如定义、打开、取值及关闭操作,都由
ORACLE
系统自动地完成,无需用户进行
处理
。 用户只能通过隐式游标的相关属性,来完成相应的操作。 在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新
处理
的一条SQL 语句所包含的数据。 格式调用为: SQL% 注:INSERT, UPDATE, DELETE, SELECT 语句中不必明确定义游标。 隐式游标属性 SQL%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为true; SQL%NOTFOUND 布尔型属性,与%found相反; SQL %ROWCOUNT 数字型属性, 返回已从游标中读取得记录数; SQL %ISOPEN 布尔型属性, 取值总是FALSE。SQL命令执行完毕立即关闭隐式游标。
Oracle
where
if
一.
where
case when
Oracle
where
不能如其他sql直接添加if逻辑,只能使用case when select * from table_data t
where
(case when t.column_data='
条件
' then t.column_data when t.column_data='
条件
2' then t.rep_data )='
条件
3' 二.
where
case when(变形) select * from table_data t
where
t.c
oracle
在sql语句
where
后加
条件
判断
加粗样式 有两种方式: 第一种,使用decode函数 SELECT * FROM prj_project pp
WHERE
(case when (case when pp.business_type = ‘LEASE’ then 1 else 0 end) = 1 then pp.business_type else pp.document_type end) = (case when (case when pp.business_type = ‘LEASE’ then 1 else 0 end) = 1
SQL
where
条件
中加
判断
select * from a
where
(case when a.id=1 then a.id else a.name end) =a.id
Oracle
17,086
社区成员
55,238
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章