sql函数的补充

本文详细介绍了Oracle SQL中各类常用函数的功能与用法,包括数字类型函数如cos、log等,字符类型函数如substr、replace、translate等,以及数学函数如abs、power等。文章通过实例说明了每个函数的具体应用。

在数字类型的函数中需要注意一点是:许多函数只支持返回小数到38位

但是像一些数学类型的函数例如cos、log等都只支持到小数点后36位

像ACOS,ASin等的函数只能支持到小数点后30位

而字符类型的函数中如果函数返回char类型,长度不超过2000字节

VARchar类型长度不超过4000字节,如果长度超过,Oracle会直接截断值最大支持长度

clob类型的函数,返回长度不超过4G,一旦超过,函数直接报错。

Substr函数的各种用法
1.substr(‘abcd1234’,1,2):意思是从参函1的第参数2位开始向后取参数3位;


2.substr(‘abcd1234’,0,2):结果和第一种方式相同,但是由于对于字符来说没有第0位,所以结果是一样的。


3.substr(‘abcd1234’,2):如果不指定参数3,函数会直接截取参数2 位后的所有字符


4.substr(‘abcd1234’,-4,3):参数2位负数,指的是从后向前第四位开始


5.substr(‘abcd1234’,-10)和substr(‘abcd1234’,-8):由于字符串的总长度是8位,所以当参数1的长度大于参数1的总长度时,函数不返回值



Replace的各种用法
1.replace (‘abcd1234’,’abcd’)和replace(‘abcd1234’,’abcd’,’’):replace函数中参数3为null和没有参数3的结果是一样的:


2.replace(‘abcd1234’,’’,’1234’)和replace(‘abcd1234’,’abcd’,’’):在参数2中出现null,整个函数会返回参数1,参数3为null会删除参数2中的所有字符:


Translate函数的各种用法
1.translate(‘abcd12334’,’123456’,’abcdef’):translate函数是在参数1中,将参数2所对应的字符用参数3中的字符替换,如果参数2中存在参数1中没有的字符,会自动排除。


函数中的参数不检查顺序,只是以单个字符为单位执行函数。
0.translate(‘aaabbbcccddd’,’abc’,’123’):用函数来证明以上现象:


此函数执行时无视顺序,以单个字符为单位
1.translate(‘aaabbbcccddd’,’abc’,’12’):如果参数2字符长度大于参数3,在执行函数时,无视参数2中多余参数3的那一部分,参数之间是以单个字符对应的,但是由于参数2中存在C这个字符,所以函数执行之后会直接删除。


2.translate(‘aaabbbcccddd’,’abc’,’ ‘):参数3是空格,由于SQL中会将空格视为一个字符,而且参数3中只有一个字符,所以函数执行后会将a进行替换,其他直接删除


3.translate函数中不能出现null,否则直接返回null


Instr函数的各种用法
1.instr(‘abcd1234’,’123’)和instr(‘abcd1234’’12345’):由于instr函数在执行时会寻找参数中第一个字符匹配的位置,但是在寻找过程中是以参数2整个字符串为单位的。


2.instr(‘abcd1234’,’12’,1)和instr(‘abcd1234’,’12’,3)和instr(‘abcd1234’,’12’,6):函数中参数3的意思是从指定的位置开始寻找,但是找到后还是会返回整个参数1中的位置,但是由于第6位之后没有12,所以函数会返回0;


3.instr(‘abcd1234’,’12’,-3)和instr(‘abcd1234’,’12’,-6):参数3为负,首先是指从后向前数第三位,在instr函数中还指函数的寻找方向是从后向前,找到后会返回参数2在整个参数1中的绝对位置


4.instr(‘abcd1234abcd1234’,’12’,1,2)和instr(‘abcd1234abcd1234’,’12’,-1,2):参数4代表寻找参数2在参数1中第二次出现的位置。


Trim函数的各种用法
1.rtrim(‘abc111222333’,’123’):这种用法也证明了,trim函数在执行时是以单个字符为单位的。


2.ltrim(‘321abc123’,’123’):由于函数执行时是以单个字符为单位的,并且L关键字规定了函数只能操作整个字符串从中间开始左边的那一部分,所以整个函数会返回ABC123


3.trim(‘   abc   ’):trim函数中只有参数1,并且关键字只有trim时,整个函数是用来删除字符串两边的空格的。


4.trim(‘_’ from ‘___abc___’):是函数的另一种写法,但是整个函数的含义没有变化


Lpad补位函数:
此函数是用于对参数进行补位操作的


在函数没有参数3时,会自动为参数1补空格,与trim函数是相反的
Lpad(‘1’,10,’0’):这时,函数会自动为参数1补参数3至参数2位。



Chr函数和ASCII函数:
chr函数是将数值转换成ASCII码中数值代表的那个字符,ASCII函数是将字符在ASCII码中所对应的数值显示出来:


但是对于ASCII函数,当参数中存在多个字符时,会只返回第一个字符所对应的位置


一些数学函数
Abs():取参数的绝对值:


Power(参数1,参数2):对参数进行求次幂运算


Sqrt:对参数进行平方根运算


Log(参数1,参数2):进行log运算


Mod函数:取余数运算,有一个特殊点是,mod函数中除数可以是0,当除数为0时,函数返回参数1.


Ceil()函数:求比参数大的第一个整数


Floor()函数,求比参数小的第一个整数


Sign()函数:求参数是否正,如果为正返回1,为负返回-1,参数为0则返回0;


Greaest(参数1,参数2,….):函数可以存在多个参数,只返回参数中的最大值。


Least(参数1,参数2,…)求参数中的最小值



<think> 我们正在讨论SQL中的INSTR函数。根据用户提供的引用内容,我们可以总结出INSTR函数的基本信息和用法。 引用[4]提供了详细的参数说明和示例,引用[1][2][3]则补充了其他使用场景和注意事项。 因此,我们将按照以下结构组织回答: 1. INSTR函数简介:包括功能、语法和参数说明。 2. 具体用法和示例:展示不同参数组合下的使用方式。 3. 应用场景:如字符串分割、结合SUBSTR使用等。 4. 注意事项:包括性能、错误处理等。 同时,我们将引用相关段落,并在末尾添加引用标识。 注意:用户要求尽可能参考上一次的问题和回答,但当前问题独立,因此我们专注于INSTR函数的讲解。 最后,生成相关问题。 </think>### SQL INSTR函数详解 #### 一、函数简介 `INSTR`函数SQL中用于**定位子字符串位置**的核心字符串函数,功能类似于其他语言的`indexOf()`方法。它返回子字符串在源字符串中**首次出现的位置**(从1开始计数),若未找到则返回0[^4]。主要数据库系统(Oracle, MySQL, PostgreSQL等)均支持此函数。 #### 二、完整语法 ```sql INSTR(string1, string2 [, start_position [, nth_occurrence]]) ``` 参数说明: - **`string1`**:源字符串(必选)[^4] - **`string2`**:要查找的子字符串(必选)[^4] - **`start_position`**(可选): - 正数:从左向右搜索(默认值1) - 负数:从右向左搜索(如-1表示从末尾开始)[^4] - **`nth_occurrence`**(可选): - 正数:查找第n次出现(默认值1) - 负数:从右向左查找第n次出现[^4] --- #### 三、用法示例 1. **基础定位** ```sql SELECT INSTR('helloworld', 'l') FROM DUAL; -- 返回3(首个'l'位置)[^4] ``` 2. **指定起始位置** ```sql SELECT INSTR('Oracle Database', 'a', 3) FROM DUAL; -- 返回5(从第3位开始找'a')[^4] ``` 3. **查找第n次出现** ```sql SELECT INSTR('hello world', 'o', 1, 2) FROM DUAL; -- 返回5(第2个'o'位置)[^4] ``` 4. **反向搜索(从右向左)** ```sql SELECT INSTR('apple orange', 'a', -1) FROM DUAL; -- 返回9(从末尾找到的'a')[^4] ``` 5. **结合`LIKE`实现复杂匹配** ```sql SELECT * FROM contacts WHERE INSTR(phone, '123') > 0 AND phone LIKE '%5555%'; -- 同时满足子串存在和模式匹配[^2] ``` --- #### 四、核心应用场景 1. **字符串分割** 提取分隔符间的内容,如截取地址中的行政区划: ```sql SELECT CASE WHEN INSTR(address, '镇', -1) > 0 THEN SUBSTR(address, 1, INSTR(address, '镇', -1)) WHEN INSTR(address, '街道', -1) > 0 THEN SUBSTR(address, 1, INSTR(address, '街道', -1)+1) ELSE address END AS district FROM users; -- 提取"镇"或"街道"前的地址部分[^4] ``` 2. **数据清洗** 检查并处理异常字符: ```sql UPDATE products SET description = REPLACE(description, '#', '') WHERE INSTR(description, '#') > 0; -- 删除包含"#"的描述 ``` 3. **动态SQL生成** 结合其他函数构建查询条件: ```sql SELECT * FROM logs WHERE INSTR(error_message, 'timeout') > INSTR(error_message, 'retry'); -- 定位错误顺序 ``` --- #### 五、性能与注意事项 1. **索引优化** 避免在`WHERE`条件中单独使用`INSTR`,优先考虑**全文索引**或`LIKE`(带通配符)[^1]。 2. **错误处理** 始终检查返回值是否为0,避免后续操作出错: ```sql SELECT CASE WHEN INSTR(text, 'error') > 0 THEN '异常' ELSE '正常' END AS status FROM reports; ``` 3. **跨数据库兼容** - Oracle/SQL Server:`INSTR()` 或 `CHARINDEX()`[^3] - MySQL:`INSTR()` 或 `LOCATE()` - PostgreSQL:`STRPOS()` --- ### 📚 相关问题 1. **`INSTR`与`LIKE`在模糊查询中的性能差异如何量化评估?**[^1] 2. **如何利用`INSTR`实现SQL中的递归字符串解析?** 3. **在多字节字符集(如UTF-8)环境下,`INSTR`的定位计算是否准确?** 4. **`INSTR`的返回值能否直接用于`SUBSTR`截取中文字符?** [^1]: INSTR适用于多种场景,但需避免过度使用影响性能[^1]。 [^2]: 可结合LIKE操作符实现复杂模式匹配[^2]。 [^3]: 在ObjectScript中可通过`$SYSTEM.SQL.INSTR()`调用[^3]。 [^4]: 核心参数说明及地址截取案例[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值