3838|new_time
3939|tz_offset
4040|trunc
41+ |instr
4142|instrb
4243|substr
4344|substrb
@@ -278,7 +279,68 @@ select trunc(sysdate(),'mm') from dual;
278279(1 row)
279280```
280281
281- 12、兼容instrb函数,功能:字符串查找函数,返回字符串的位置,支持参数: varchar2, text, number DEFAULT 1, number DEFAULT 1,以下为测试用例:
282+ 12、兼容instr函数,功能:字符串查找函数,用于判断源字符串中是否包含目标字符串,并返回匹配位置。支持参数形式如下:
283+
284+ * `instr(string, str)`
285+ * `instr(string, str, start_position, nth_appearance)`
286+
287+ 以下为测试用例:
288+
289+ 默认情况下返回第一次匹配的位置:
290+
291+ ```
292+ SELECT INSTR('database administration', 'data') FROM DUAL;
293+ instr
294+ -------
295+ 1
296+ (1 row)
297+ ```
298+
299+ 指定起始位置和匹配序号:
300+
301+ ```
302+ SELECT INSTR('database administration', 'i', 1, 2) FROM DUAL;
303+ instr
304+ -------
305+ 15
306+ (1 row)
307+ ```
308+
309+ 支持从尾部开始的反向搜索:
310+
311+ ```
312+ SELECT INSTR('mississippi river', 's', -5, 2) FROM DUAL;
313+ instr
314+ -------
315+ 6
316+ (1 row)
317+ ```
318+
319+ 当未匹配到目标字符串时返回0:
320+
321+ ```
322+ SELECT INSTR('database administration', 'z') FROM DUAL;
323+ instr
324+ -------
325+ 0
326+ (1 row)
327+ ```
328+
329+ `instr` 还能像 `like` 一样用于模糊查询:
330+
331+ ```
332+ select * from tableName where instr(name,'helloworld')>0;
333+ ```
334+
335+ 函数实现说明:
336+
337+ * 查找一个字符串在另一个字符串中的位置,采用经典的暴力匹配算法。
338+ * 复用了 `text_instring` 函数。
339+ * 通过 `isByte` 参数判断当前数据库编码是否为多字节,并区分单字节与多字节处理逻辑。
340+ * 根据 `position` 的正负确定正向或反向搜索,并设置循环的起止位置和步长。
341+ * 在循环中逐字节移动并比较,与模式字符串匹配成功即返回相应位置。
342+
343+ 13、兼容instrb函数,功能:字符串查找函数,返回字符串的位置,支持参数: varchar2, text, number DEFAULT 1, number DEFAULT 1,以下为测试用例:
282344返回CORPORATE FLOOR中默认第一次出现OR时字符串的位置:
283345
284346```
@@ -299,7 +361,7 @@ SELECT INSTRB('CORPORATE FLOOR','OR',5,2) "Instring in bytes" FROM DUAL;
299361(1 row)
300362```
301363
302- 13 、兼容substr函数,功能:截取字符串函数,以字符为单位截取,支持参数:text, integer, 测试用例如下:
364+ 14 、兼容substr函数,功能:截取字符串函数,以字符为单位截取,支持参数:text, integer, 测试用例如下:
303365截取’今天天气很好’中从第五个字符开始,往后的字符串:
304366
305367```
@@ -311,7 +373,7 @@ SELECT SUBSTR('今天天气很好',5) "Substring with bytes" FROM DUAL;
311373(1 row)
312374```
313375
314- 14 、兼容substrb函数,功能:截取字符串函数,以字节为单位截取,支持参数:varchar2, number/varchar2, number,number,测试用例如下:
376+ 15 、兼容substrb函数,功能:截取字符串函数,以字节为单位截取,支持参数:varchar2, number/varchar2, number,number,测试用例如下:
315377截取’今天天气很好’中从第五个字节开始,往后的字符串:
316378
317379```
@@ -332,7 +394,7 @@ SELECT SUBSTRB('今天天气很好',5,8) "Substring with bytes" FROM DUAL;
332394(1 row)
333395```
334396
335- 15 、兼容trim函数,功能:去除指定字符串的左右空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
397+ 16 、兼容trim函数,功能:去除指定字符串的左右空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
336398去除' aaa bbb ccc '的左右空格:
337399
338400```
@@ -353,7 +415,7 @@ select trim('aaa bbb ccc','aaa')trim from dual;
353415(1 row)
354416```
355417
356- 16 、兼容ltrim函数,功能:去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
418+ 17 、兼容ltrim函数,功能:去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
357419去除' abcdefg '的左侧空格:
358420
359421```
@@ -374,7 +436,7 @@ select ltrim('abcdefg','fegab')ltrim from dual;
374436(1 row)
375437```
376438
377- 17 、兼容rtrim函数,功能:去除指定字符串的右侧空格,测试用例如下:
439+ 18 、兼容rtrim函数,功能:去除指定字符串的右侧空格,测试用例如下:
378440去除' abcdefg '的右侧空格:
379441
380442```
@@ -395,7 +457,7 @@ select rtrim('abcdefg','fegab')rtrim from dual;
395457(1 row)
396458```
397459
398- 18 、兼容length函数,功能:求取指定字符串字符的长度,支持参数:char/integer/varchar2测试用例如下:
460+ 19 、兼容length函数,功能:求取指定字符串字符的长度,支持参数:char/integer/varchar2测试用例如下:
399461查询223的字符长度:
400462
401463```
@@ -426,7 +488,7 @@ select length('ivorysql数据库') from dual;
426488(1 row)
427489```
428490
429- 19 、兼容lengthb功能:求取指定字符串字节的长度,支持参数:char/bytea/varchar2测试用例如下:
491+ 20 、兼容lengthb功能:求取指定字符串字节的长度,支持参数:char/bytea/varchar2测试用例如下:
430492查询'ivorysql'的字节长度:
431493
432494```
@@ -457,7 +519,7 @@ select lengthb('ivorysql数据库'::varchar2) from dual;
457519(1 row)
458520```
459521
460- 20 、兼容replace函数,功能:替换指定字符串中的字符或删除字符,支持参数:text, text, text/varchar2, varchar2, varchar2 DEFAULT NULL::varchar2, 测试用例如下:
522+ 21 、兼容replace函数,功能:替换指定字符串中的字符或删除字符,支持参数:text, text, text/varchar2, varchar2, varchar2 DEFAULT NULL::varchar2, 测试用例如下:
461523替换'jack and jue'中的'j'为'bl':
462524
463525```
@@ -478,7 +540,7 @@ select replace('jack and jue','j') from dual;
478540(1 row)
479541```
480542
481- 21 、兼容regexp_replace函数,此函数为replace函数的扩展。功能:用于通过正则表达式来进行匹配替换。支持参数:text, text, text /text, text, text, integer/varchar2, varchar2/varchar2, varchar2 varchar2, 测试用例如下:
543+ 22 、兼容regexp_replace函数,此函数为replace函数的扩展。功能:用于通过正则表达式来进行匹配替换。支持参数:text, text, text /text, text, text, integer/varchar2, varchar2/varchar2, varchar2 varchar2, 测试用例如下:
482544将匹配到的数字替换为*#:
483545
484546```
@@ -518,7 +580,7 @@ select regexp_replace('01234abcd56789','012','xxx')from dual;
518580(1 row)
519581```
520582
521- 22 、兼容regexp_substr函数,功能:拾取合符正则表达式描述的字符子串,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text /varchar2 ,varchar2,测试用例如下:
583+ 23 、兼容regexp_substr函数,功能:拾取合符正则表达式描述的字符子串,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text /varchar2 ,varchar2,测试用例如下:
522584查询'012ab34'中从第一个数开始的012字串:
523585
524586```
@@ -568,7 +630,7 @@ select regexp_substr('数据库', '数据') from dual;
568630(1 row)
569631```
570632
571- 23 、兼容regexp_instr函数,功能:用于标定符合正则表达式的字符子串的开始位置,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text/text, text, integer, integer, text, integer/ varchar2, varchar2,测试用例如下:
633+ 24 、兼容regexp_instr函数,功能:用于标定符合正则表达式的字符子串的开始位置,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text/text, text, integer, integer, text, integer/ varchar2, varchar2,测试用例如下:
572634查询'abcaBcabc'中从第一个字符开始,出现abc子串的位置:
573635
574636```
@@ -619,7 +681,7 @@ SELECT regexp_instr('数据库', '库');
619681(1 row)
620682```
621683
622- 24 、兼容regexp_like函数,功能:与like类似,用于模糊查询。支持参数:varchar2, varchar2 /varchar2, varchar2 varchar2,
684+ 25 、兼容regexp_like函数,功能:与like类似,用于模糊查询。支持参数:varchar2, varchar2 /varchar2, varchar2 varchar2,
623685首先创建一个regexp_like表用于测试用例查询:
624686
625687```
@@ -669,7 +731,7 @@ select * from t_regexp_like where regexp_like(value,'ABC','i');
669731
670732```
671733
672- 25 、兼容to_number函数,功能:是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text测试用例如下:
734+ 26 、兼容to_number函数,功能:是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text测试用例如下:
673735将字符串'-34,338,492'转换为数值型格式:
674736
675737```
@@ -691,7 +753,7 @@ SELECT to_number('5.01-', '9.99S');
691753(1 row)
692754```
693755
694- 26 、兼容to_char函数,功能:将数字或日期转换为字符类型,支持参数:date/date,text/timestamp/timestamp,text测试用例如下:
756+ 27 、兼容to_char函数,功能:将数字或日期转换为字符类型,支持参数:date/date,text/timestamp/timestamp,text测试用例如下:
695757将当前系统日期转换为字符格式:
696758
697759```
@@ -731,7 +793,7 @@ SELECT to_char(sysdate()::timestamp,'MM-YYYY-DD');
731793(1 row)
732794```
733795
734- 27 、兼容to_date函数,功能:将字符类型转换为日期类型,支持参数:text/text,text测试用例如下:
796+ 28 、兼容to_date函数,功能:将字符类型转换为日期类型,支持参数:text/text,text测试用例如下:
735797将'2023/07/06'转换为日期类型:
736798
737799```
@@ -752,7 +814,7 @@ SELECT to_date('-44,0201','YYYY-MM-DD');
752814(1 row)
753815```
754816
755- 28 、兼容to_timestamp函数,功能:可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。支持参数:text/text,text测试用例如下:
817+ 29 、兼容to_timestamp函数,功能:可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。支持参数:text/text,text测试用例如下:
756818查询'2018-11-02 12:34:56.025'以日期形式输出:
757819
758820```
@@ -773,7 +835,7 @@ SELECT to_timestamp('2011,12,18 11:38 ', 'YYYY-MM-DD HH24:MI:SS');
773835(1 row)
774836```
775837
776- 29 、兼容to_timestamp_tz函数,功能:根据时间查询,时间字符串有T,Z并有毫秒,时区。测试用例如下:
838+ 30 、兼容to_timestamp_tz函数,功能:根据时间查询,时间字符串有T,Z并有毫秒,时区。测试用例如下:
777839查询'2016-10-9 14:10:10.123000'以日期形式输出:
778840
779841```
@@ -794,7 +856,7 @@ SELECT to_timestamp('2011,12,18 11:38 ', 'YYYY-MM-DD HH24:MI:SS');
794856(1 row)
795857```
796858
797- 30 、兼容to_yminterval函数,功能:将一个字符串类型转化为年和月的时间差类型,支持参数:text, 测试用例如下:
859+ 31 、兼容to_yminterval函数,功能:将一个字符串类型转化为年和月的时间差类型,支持参数:text, 测试用例如下:
798860查询'20110101'以后两个年零八个月后的日期:
799861
800862```
@@ -805,7 +867,7 @@ select to_date('20110101','yyyymmdd')+to_yminterval('02-08') from dual;
805867(1 row)
806868```
807869
808- 31 、兼容to_dsinterval函数,功能:将一个日期加上一定的小时或者天数变成另外一个日期,支持参数:text,测试用例如下:
870+ 32 、兼容to_dsinterval函数,功能:将一个日期加上一定的小时或者天数变成另外一个日期,支持参数:text,测试用例如下:
809871查询当前系统时间加上9个半小时后的日期(当前为2023-07-06,18:00):
810872
811873```
@@ -816,7 +878,7 @@ select sysdate()+to_dsinterval('0 09:30:00')as newdate from dual;
816878(1 row)
817879```
818880
819- 32 、兼容numtodsinterval函数,功能:将数字转换成时间间隔类型的数据。支持参数:double precision, text测试用例如下:
881+ 33 、兼容numtodsinterval函数,功能:将数字转换成时间间隔类型的数据。支持参数:double precision, text测试用例如下:
820882转换100.00个小时为时间间隔类型数据:
821883
822884```
@@ -837,7 +899,7 @@ SELECT NUMTODSINTERVAL(100, 'minute');
837899(1 row)
838900```
839901
840- 33 、兼容numtoyminterval函数,功能:将数字转换成日期间隔类型的数据。
902+ 34 、兼容numtoyminterval函数,功能:将数字转换成日期间隔类型的数据。
841903支持参数:double precision,text,测试用例如下:
842904转换1.00,year为日期间隔:
843905
@@ -859,7 +921,7 @@ SELECT NUMTOYMINTERVAL(1,'month');
859921(1 row)
860922```
861923
862- 34 、兼容localtimestamp函数,功能:返回会话中的日期和时间,支持参数:integer, 函数中增加参数为精度,测试用例如下:
924+ 35 、兼容localtimestamp函数,功能:返回会话中的日期和时间,支持参数:integer, 函数中增加参数为精度,测试用例如下:
863925返回当前会话中的日期和时间:
864926
865927```
@@ -880,7 +942,7 @@ select localtimestamp(1) from dual;
880942(1 row)
881943```
882944
883- 35 、兼容from_tz函数,功能:将时间从一个时区转换为另一个时区,支持参数;timestamp, text ,测试用例如下:
945+ 36 、兼容from_tz函数,功能:将时间从一个时区转换为另一个时区,支持参数;timestamp, text ,测试用例如下:
884946将'2000-03-28 08:00:00', '3:00'转换为当前时区:
885947
886948```
@@ -891,7 +953,7 @@ SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') FROM DUAL;
891953(1 row)
892954```
893955
894- 36 、兼容sys_extract_utc函数,功能:将一个timestamptz转换为UTC时区时间。支持参数:timestamp with time zone 测试用例如下:
956+ 37 、兼容sys_extract_utc函数,功能:将一个timestamptz转换为UTC时区时间。支持参数:timestamp with time zone 测试用例如下:
895957查询转换timestamp '2000-03-28 11:30:00.00 -8:00'为UTC时区后的时间:
896958
897959```
@@ -902,7 +964,7 @@ select sys_extract_utc(timestamp '2000-03-28 11:30:00.00 -8:00') from dual;
902964(1 row)
903965```
904966
905- 37 、兼容sessiontimezone函数,功能:查看时区详细信息,测试用例如下:
967+ 38 、兼容sessiontimezone函数,功能:查看时区详细信息,测试用例如下:
906968查看当前时区的详细信息:
907969
908970```
@@ -925,7 +987,7 @@ select sessiontimezone() from dual;
925987(1 row)
926988```
927989
928- 38 、兼容hextoraw函数,功能:将字符串表示的二进制数值转换为一个raw数值。支持参数:text,测试用例如下:
990+ 39 、兼容hextoraw函数,功能:将字符串表示的二进制数值转换为一个raw数值。支持参数:text,测试用例如下:
929991将字符串'abcdef'转换为raw数值:
930992
931993```
@@ -936,7 +998,7 @@ select hextoraw('abcdef')from dual;
936998(1 row)
937999```
9381000
939- 39 、兼容uid函数,功能:获取数据库的实例名。测试用例如下:
1001+ 40 、兼容uid函数,功能:获取数据库的实例名。测试用例如下:
9401002获取当前数据库的实例名:
9411003
9421004```
@@ -947,7 +1009,7 @@ select uid() from dual;
9471009(1 row)
9481010```
9491011
950- 40 、兼容USERENV函数,功能:返回当前用户环境的信息,测试用例如下:
1012+ 41 、兼容USERENV函数,功能:返回当前用户环境的信息,测试用例如下:
9511013查看当前用户是否是dba,如果是返回ture:
9521014
9531015```
@@ -968,7 +1030,7 @@ select userenv('sessionid')from dual;
9681030(1 row)
9691031```
9701032
971- 41 、兼容ASCIISTR函数,功能:传入字符串,返回对应的ASCII字符,测试用例如下:
1033+ 42 、兼容ASCIISTR函数,功能:传入字符串,返回对应的ASCII字符,测试用例如下:
9721034只有ASCII字符:
9731035```
9741036 select asciistr('Hello, World!') from dual;
@@ -995,7 +1057,7 @@ select userenv('sessionid')from dual;
9951057(1 row)
9961058```
9971059
998- 42 、兼容TO_MULTI_BYTE函数, 功能:将字符串中的半角字符转换为全角字符:
1060+ 43 、兼容TO_MULTI_BYTE函数, 功能:将字符串中的半角字符转换为全角字符:
9991061输入半角字符,转换为全角字符:
10001062```
10011063select to_multi_byte('1.2'::text) ;
@@ -1004,7 +1066,7 @@ select to_multi_byte('1.2'::text) ;
10041066 1.2
10051067```
10061068
1007- 43 、兼容TO_SINGLE_BYTE函数, 功能:将字符串中的半角字符转换为全角字符
1069+ 44 、兼容TO_SINGLE_BYTE函数, 功能:将字符串中的半角字符转换为全角字符
10081070输入全角字符,转换为半角字符:
10091071```
10101072select to_single_byte('1.2');
@@ -1013,7 +1075,7 @@ select to_single_byte('1.2');
10131075 1.2
10141076```
10151077
1016- 44 、兼容COMPOSE函数,功能:将基本字符和组合标记组合一个复合Unicode字符:
1078+ 45 、兼容COMPOSE函数,功能:将基本字符和组合标记组合一个复合Unicode字符:
10171079输入基本字符a和组合标记768, 返回法语à
10181080```
10191081select compose('a'||chr(768)) from dual;
@@ -1024,7 +1086,7 @@ select compose('a'||chr(768)) from dual;
10241086```
10251087
10261088
1027- 45 、兼容DECOMPOSE函数,功能:将复合Unicode字符(如带有重音或特殊符号的字符)分解为其基本字符和组合标记
1089+ 46 、兼容DECOMPOSE函数,功能:将复合Unicode字符(如带有重音或特殊符号的字符)分解为其基本字符和组合标记
10281090输入法语é,返回基本字符e和组合标记301:
10291091```
10301092select asciistr(decompose('é')) from dual;
0 commit comments