@@ -278,7 +278,68 @@ select trunc(sysdate(),'mm') from dual;
278278(1 row)
279279```
280280
281- 12、兼容instrb函数,功能:字符串查找函数,返回字符串的位置,支持参数: varchar2, text, number DEFAULT 1, number DEFAULT 1,以下为测试用例:
281+ 12、兼容instr函数,功能:字符串查找函数,用于判断源字符串中是否包含目标字符串,并返回匹配位置。支持参数形式如下:
282+
283+ * `instr(string, str)`
284+ * `instr(string, str, start_position, nth_appearance)`
285+
286+ 以下为测试用例:
287+
288+ 默认情况下返回第一次匹配的位置:
289+
290+ ```
291+ SELECT INSTR('database administration', 'data') FROM DUAL;
292+ instr
293+ -------
294+ 1
295+ (1 row)
296+ ```
297+
298+ 指定起始位置和匹配序号:
299+
300+ ```
301+ SELECT INSTR('database administration', 'i', 1, 2) FROM DUAL;
302+ instr
303+ -------
304+ 15
305+ (1 row)
306+ ```
307+
308+ 支持从尾部开始的反向搜索:
309+
310+ ```
311+ SELECT INSTR('mississippi river', 's', -5, 2) FROM DUAL;
312+ instr
313+ -------
314+ 6
315+ (1 row)
316+ ```
317+
318+ 当未匹配到目标字符串时返回0:
319+
320+ ```
321+ SELECT INSTR('database administration', 'z') FROM DUAL;
322+ instr
323+ -------
324+ 0
325+ (1 row)
326+ ```
327+
328+ `instr`还能像`like`一样用于模糊查询:
329+
330+ ```
331+ select * from tableName where instr(name,'helloworld')>0;
332+ ```
333+
334+ 函数实现说明:
335+
336+ * 查找一个字符串在另一个字符串中的位置,采用经典的暴力匹配算法。
337+ * 复用了 `text_instring` 函数。
338+ * 通过 `isByte` 参数判断当前数据库编码是否为多字节,并区分单字节与多字节处理逻辑。
339+ * 根据 `position` 的正负确定正向或反向搜索,并设置循环的起止位置和步长。
340+ * 在循环中逐字节移动并比较,与模式字符串匹配成功即返回相应位置。
341+
342+ 13、兼容instrb函数,功能:字符串查找函数,返回字符串的位置,支持参数: varchar2, text, number DEFAULT 1, number DEFAULT 1,以下为测试用例:
282343返回CORPORATE FLOOR中默认第一次出现OR时字符串的位置:
283344
284345```
@@ -299,7 +360,7 @@ SELECT INSTRB('CORPORATE FLOOR','OR',5,2) "Instring in bytes" FROM DUAL;
299360(1 row)
300361```
301362
302- 13 、兼容substr函数,功能:截取字符串函数,以字符为单位截取,支持参数:text, integer, 测试用例如下:
363+ 14 、兼容substr函数,功能:截取字符串函数,以字符为单位截取,支持参数:text, integer, 测试用例如下:
303364截取’今天天气很好’中从第五个字符开始,往后的字符串:
304365
305366```
@@ -311,7 +372,7 @@ SELECT SUBSTR('今天天气很好',5) "Substring with bytes" FROM DUAL;
311372(1 row)
312373```
313374
314- 14 、兼容substrb函数,功能:截取字符串函数,以字节为单位截取,支持参数:varchar2, number/varchar2, number,number,测试用例如下:
375+ 15 、兼容substrb函数,功能:截取字符串函数,以字节为单位截取,支持参数:varchar2, number/varchar2, number,number,测试用例如下:
315376截取’今天天气很好’中从第五个字节开始,往后的字符串:
316377
317378```
@@ -332,7 +393,7 @@ SELECT SUBSTRB('今天天气很好',5,8) "Substring with bytes" FROM DUAL;
332393(1 row)
333394```
334395
335- 15 、兼容trim函数,功能:去除指定字符串的左右空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
396+ 16 、兼容trim函数,功能:去除指定字符串的左右空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
336397去除' aaa bbb ccc '的左右空格:
337398
338399```
@@ -353,7 +414,7 @@ select trim('aaa bbb ccc','aaa')trim from dual;
353414(1 row)
354415```
355416
356- 16 、兼容ltrim函数,功能:去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
417+ 17 、兼容ltrim函数,功能:去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:
357418去除' abcdefg '的左侧空格:
358419
359420```
@@ -374,7 +435,7 @@ select ltrim('abcdefg','fegab')ltrim from dual;
374435(1 row)
375436```
376437
377- 17 、兼容rtrim函数,功能:去除指定字符串的右侧空格,测试用例如下:
438+ 18 、兼容rtrim函数,功能:去除指定字符串的右侧空格,测试用例如下:
378439去除' abcdefg '的右侧空格:
379440
380441```
@@ -395,7 +456,7 @@ select rtrim('abcdefg','fegab')rtrim from dual;
395456(1 row)
396457```
397458
398- 18 、兼容length函数,功能:求取指定字符串字符的长度,支持参数:char/integer/varchar2测试用例如下:
459+ 19 、兼容length函数,功能:求取指定字符串字符的长度,支持参数:char/integer/varchar2测试用例如下:
399460查询223的字符长度:
400461
401462```
@@ -426,7 +487,7 @@ select length('ivorysql数据库') from dual;
426487(1 row)
427488```
428489
429- 19 、兼容lengthb功能:求取指定字符串字节的长度,支持参数:char/bytea/varchar2测试用例如下:
490+ 20 、兼容lengthb功能:求取指定字符串字节的长度,支持参数:char/bytea/varchar2测试用例如下:
430491查询'ivorysql'的字节长度:
431492
432493```
@@ -457,7 +518,7 @@ select lengthb('ivorysql数据库'::varchar2) from dual;
457518(1 row)
458519```
459520
460- 20 、兼容replace函数,功能:替换指定字符串中的字符或删除字符,支持参数:text, text, text/varchar2, varchar2, varchar2 DEFAULT NULL::varchar2, 测试用例如下:
521+ 21 、兼容replace函数,功能:替换指定字符串中的字符或删除字符,支持参数:text, text, text/varchar2, varchar2, varchar2 DEFAULT NULL::varchar2, 测试用例如下:
461522替换'jack and jue'中的'j'为'bl':
462523
463524```
@@ -478,7 +539,7 @@ select replace('jack and jue','j') from dual;
478539(1 row)
479540```
480541
481- 21 、兼容regexp_replace函数,此函数为replace函数的扩展。功能:用于通过正则表达式来进行匹配替换。支持参数:text, text, text /text, text, text, integer/varchar2, varchar2/varchar2, varchar2 varchar2, 测试用例如下:
542+ 22 、兼容regexp_replace函数,此函数为replace函数的扩展。功能:用于通过正则表达式来进行匹配替换。支持参数:text, text, text /text, text, text, integer/varchar2, varchar2/varchar2, varchar2 varchar2, 测试用例如下:
482543将匹配到的数字替换为*#:
483544
484545```
@@ -518,7 +579,7 @@ select regexp_replace('01234abcd56789','012','xxx')from dual;
518579(1 row)
519580```
520581
521- 22 、兼容regexp_substr函数,功能:拾取合符正则表达式描述的字符子串,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text /varchar2 ,varchar2,测试用例如下:
582+ 23 、兼容regexp_substr函数,功能:拾取合符正则表达式描述的字符子串,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text /varchar2 ,varchar2,测试用例如下:
522583查询'012ab34'中从第一个数开始的012字串:
523584
524585```
@@ -568,7 +629,7 @@ select regexp_substr('数据库', '数据') from dual;
568629(1 row)
569630```
570631
571- 23 、兼容regexp_instr函数,功能:用于标定符合正则表达式的字符子串的开始位置,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text/text, text, integer, integer, text, integer/ varchar2, varchar2,测试用例如下:
632+ 24 、兼容regexp_instr函数,功能:用于标定符合正则表达式的字符子串的开始位置,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text/text, text, integer, integer, text, integer/ varchar2, varchar2,测试用例如下:
572633查询'abcaBcabc'中从第一个字符开始,出现abc子串的位置:
573634
574635```
@@ -619,7 +680,7 @@ SELECT regexp_instr('数据库', '库');
619680(1 row)
620681```
621682
622- 24 、兼容regexp_like函数,功能:与like类似,用于模糊查询。支持参数:varchar2, varchar2 /varchar2, varchar2 varchar2,
683+ 25 、兼容regexp_like函数,功能:与like类似,用于模糊查询。支持参数:varchar2, varchar2 /varchar2, varchar2 varchar2,
623684首先创建一个regexp_like表用于测试用例查询:
624685
625686```
@@ -669,7 +730,7 @@ select * from t_regexp_like where regexp_like(value,'ABC','i');
669730
670731```
671732
672- 25 、兼容to_number函数,功能:是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text测试用例如下:
733+ 26 、兼容to_number函数,功能:是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text测试用例如下:
673734将字符串'-34,338,492'转换为数值型格式:
674735
675736```
@@ -691,7 +752,7 @@ SELECT to_number('5.01-', '9.99S');
691752(1 row)
692753```
693754
694- 26 、兼容to_char函数,功能:将数字或日期转换为字符类型,支持参数:date/date,text/timestamp/timestamp,text测试用例如下:
755+ 27 、兼容to_char函数,功能:将数字或日期转换为字符类型,支持参数:date/date,text/timestamp/timestamp,text测试用例如下:
695756将当前系统日期转换为字符格式:
696757
697758```
@@ -731,7 +792,7 @@ SELECT to_char(sysdate()::timestamp,'MM-YYYY-DD');
731792(1 row)
732793```
733794
734- 27 、兼容to_date函数,功能:将字符类型转换为日期类型,支持参数:text/text,text测试用例如下:
795+ 28 、兼容to_date函数,功能:将字符类型转换为日期类型,支持参数:text/text,text测试用例如下:
735796将'2023/07/06'转换为日期类型:
736797
737798```
@@ -752,7 +813,7 @@ SELECT to_date('-44,0201','YYYY-MM-DD');
752813(1 row)
753814```
754815
755- 28 、兼容to_timestamp函数,功能:可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。支持参数:text/text,text测试用例如下:
816+ 29 、兼容to_timestamp函数,功能:可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。支持参数:text/text,text测试用例如下:
756817查询'2018-11-02 12:34:56.025'以日期形式输出:
757818
758819```
@@ -773,7 +834,7 @@ SELECT to_timestamp('2011,12,18 11:38 ', 'YYYY-MM-DD HH24:MI:SS');
773834(1 row)
774835```
775836
776- 29 、兼容to_timestamp_tz函数,功能:根据时间查询,时间字符串有T,Z并有毫秒,时区。测试用例如下:
837+ 30 、兼容to_timestamp_tz函数,功能:根据时间查询,时间字符串有T,Z并有毫秒,时区。测试用例如下:
777838查询'2016-10-9 14:10:10.123000'以日期形式输出:
778839
779840```
@@ -794,7 +855,7 @@ SELECT to_timestamp('2011,12,18 11:38 ', 'YYYY-MM-DD HH24:MI:SS');
794855(1 row)
795856```
796857
797- 30 、兼容to_yminterval函数,功能:将一个字符串类型转化为年和月的时间差类型,支持参数:text, 测试用例如下:
858+ 31 、兼容to_yminterval函数,功能:将一个字符串类型转化为年和月的时间差类型,支持参数:text, 测试用例如下:
798859查询'20110101'以后两个年零八个月后的日期:
799860
800861```
@@ -805,7 +866,7 @@ select to_date('20110101','yyyymmdd')+to_yminterval('02-08') from dual;
805866(1 row)
806867```
807868
808- 31 、兼容to_dsinterval函数,功能:将一个日期加上一定的小时或者天数变成另外一个日期,支持参数:text,测试用例如下:
869+ 32 、兼容to_dsinterval函数,功能:将一个日期加上一定的小时或者天数变成另外一个日期,支持参数:text,测试用例如下:
809870查询当前系统时间加上9个半小时后的日期(当前为2023-07-06,18:00):
810871
811872```
@@ -816,7 +877,7 @@ select sysdate()+to_dsinterval('0 09:30:00')as newdate from dual;
816877(1 row)
817878```
818879
819- 32 、兼容numtodsinterval函数,功能:将数字转换成时间间隔类型的数据。支持参数:double precision, text测试用例如下:
880+ 33 、兼容numtodsinterval函数,功能:将数字转换成时间间隔类型的数据。支持参数:double precision, text测试用例如下:
820881转换100.00个小时为时间间隔类型数据:
821882
822883```
@@ -837,7 +898,7 @@ SELECT NUMTODSINTERVAL(100, 'minute');
837898(1 row)
838899```
839900
840- 33 、兼容numtoyminterval函数,功能:将数字转换成日期间隔类型的数据。
901+ 34 、兼容numtoyminterval函数,功能:将数字转换成日期间隔类型的数据。
841902支持参数:double precision,text,测试用例如下:
842903转换1.00,year为日期间隔:
843904
@@ -859,7 +920,7 @@ SELECT NUMTOYMINTERVAL(1,'month');
859920(1 row)
860921```
861922
862- 34 、兼容localtimestamp函数,功能:返回会话中的日期和时间,支持参数:integer, 函数中增加参数为精度,测试用例如下:
923+ 35 、兼容localtimestamp函数,功能:返回会话中的日期和时间,支持参数:integer, 函数中增加参数为精度,测试用例如下:
863924返回当前会话中的日期和时间:
864925
865926```
@@ -880,7 +941,7 @@ select localtimestamp(1) from dual;
880941(1 row)
881942```
882943
883- 35 、兼容from_tz函数,功能:将时间从一个时区转换为另一个时区,支持参数;timestamp, text ,测试用例如下:
944+ 36 、兼容from_tz函数,功能:将时间从一个时区转换为另一个时区,支持参数;timestamp, text ,测试用例如下:
884945将'2000-03-28 08:00:00', '3:00'转换为当前时区:
885946
886947```
@@ -891,7 +952,7 @@ SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') FROM DUAL;
891952(1 row)
892953```
893954
894- 36 、兼容sys_extract_utc函数,功能:将一个timestamptz转换为UTC时区时间。支持参数:timestamp with time zone 测试用例如下:
955+ 37 、兼容sys_extract_utc函数,功能:将一个timestamptz转换为UTC时区时间。支持参数:timestamp with time zone 测试用例如下:
895956查询转换timestamp '2000-03-28 11:30:00.00 -8:00'为UTC时区后的时间:
896957
897958```
@@ -902,7 +963,7 @@ select sys_extract_utc(timestamp '2000-03-28 11:30:00.00 -8:00') from dual;
902963(1 row)
903964```
904965
905- 37 、兼容sessiontimezone函数,功能:查看时区详细信息,测试用例如下:
966+ 38 、兼容sessiontimezone函数,功能:查看时区详细信息,测试用例如下:
906967查看当前时区的详细信息:
907968
908969```
@@ -925,7 +986,7 @@ select sessiontimezone() from dual;
925986(1 row)
926987```
927988
928- 38 、兼容hextoraw函数,功能:将字符串表示的二进制数值转换为一个raw数值。支持参数:text,测试用例如下:
989+ 39 、兼容hextoraw函数,功能:将字符串表示的二进制数值转换为一个raw数值。支持参数:text,测试用例如下:
929990将字符串'abcdef'转换为raw数值:
930991
931992```
@@ -936,7 +997,7 @@ select hextoraw('abcdef')from dual;
936997(1 row)
937998```
938999
939- 39 、兼容uid函数,功能:获取数据库的实例名。测试用例如下:
1000+ 40 、兼容uid函数,功能:获取数据库的实例名。测试用例如下:
9401001获取当前数据库的实例名:
9411002
9421003```
@@ -947,7 +1008,7 @@ select uid() from dual;
9471008(1 row)
9481009```
9491010
950- 40 、兼容USERENV函数,功能:返回当前用户环境的信息,测试用例如下:
1011+ 41 、兼容USERENV函数,功能:返回当前用户环境的信息,测试用例如下:
9511012查看当前用户是否是dba,如果是返回ture:
9521013
9531014```
@@ -968,7 +1029,7 @@ select userenv('sessionid')from dual;
9681029(1 row)
9691030```
9701031
971- 41 、兼容ASCIISTR函数,功能:传入字符串,返回对应的ASCII字符,测试用例如下:
1032+ 42 、兼容ASCIISTR函数,功能:传入字符串,返回对应的ASCII字符,测试用例如下:
9721033只有ASCII字符:
9731034```
9741035 select asciistr('Hello, World!') from dual;
@@ -995,7 +1056,7 @@ select userenv('sessionid')from dual;
9951056(1 row)
9961057```
9971058
998- 42 、兼容TO_MULTI_BYTE函数, 功能:将字符串中的半角字符转换为全角字符:
1059+ 43 、兼容TO_MULTI_BYTE函数, 功能:将字符串中的半角字符转换为全角字符:
9991060输入半角字符,转换为全角字符:
10001061```
10011062select to_multi_byte('1.2'::text) ;
@@ -1004,7 +1065,7 @@ select to_multi_byte('1.2'::text) ;
10041065 1.2
10051066```
10061067
1007- 43 、兼容TO_SINGLE_BYTE函数, 功能:将字符串中的半角字符转换为全角字符
1068+ 44 、兼容TO_SINGLE_BYTE函数, 功能:将字符串中的半角字符转换为全角字符
10081069输入全角字符,转换为半角字符:
10091070```
10101071select to_single_byte('1.2');
@@ -1013,7 +1074,7 @@ select to_single_byte('1.2');
10131074 1.2
10141075```
10151076
1016- 44 、兼容COMPOSE函数,功能:将基本字符和组合标记组合一个复合Unicode字符:
1077+ 45 、兼容COMPOSE函数,功能:将基本字符和组合标记组合一个复合Unicode字符:
10171078输入基本字符a和组合标记768, 返回法语à
10181079```
10191080select compose('a'||chr(768)) from dual;
@@ -1024,7 +1085,7 @@ select compose('a'||chr(768)) from dual;
10241085```
10251086
10261087
1027- 45 、兼容DECOMPOSE函数,功能:将复合Unicode字符(如带有重音或特殊符号的字符)分解为其基本字符和组合标记
1088+ 46 、兼容DECOMPOSE函数,功能:将复合Unicode字符(如带有重音或特殊符号的字符)分解为其基本字符和组合标记
10281089输入法语é,返回基本字符e和组合标记301:
10291090```
10301091select asciistr(decompose('é')) from dual;
0 commit comments