燕珊萍 發表於 2023-8-29 00:00:00

MySQL与Oracle差异比较之三 函数

<p>
        函数</p>
<p>
         </p>
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr>
<td>
                                编号</td>
                        <td>
                                类别</td>
                        <td>
                                ORACLE</td>
                        <td>
                                MYSQL</td>
                        <td>
                                注释</td>
                </tr>
<tr>
<td>
                                1</td>
                        <td rowspan="5">
                                数字函数</td>
                        <td>
                                round(1.23456,4)</td>
                        <td>
                                round(1.23456,4)</td>
                        <td>
                                一样:<br>
                                ORACLE:select round(1.23456,4) value from dual<br>
                                MYSQL:select round(1.23456,4) value</td>
                </tr>
<tr>
<td>
                                2</td>
                        <td>
                                abs(-1)</td>
                        <td>
                                abs(-1)</td>
                        <td>
                                功能: 将当前数据取绝对值<br>
                                用法: oracle和mysql用法一样<br>
                                mysql: select abs(-1) value<br>
                                oracle: select abs(-1) value from dual</td>
                </tr>
<tr>
<td>
                                3</td>
                        <td>
                                ceil(-1.001))</td>
                        <td>
                                ceiling(-1.001)</td>
                        <td>
                                功能: 返回不小于 X 的最小整数<br>
                                用法:<br>
                                mysqls: select ceiling(-1.001) value<br>
                                oracle: select ceil(-1.001) value from dual</td>
                </tr>
<tr>
<td>
                                4</td>
                        <td>
                                floor(-1.001)</td>
                        <td>
                                floor(-1.001)</td>
                        <td>
                                功能: 返回不大于 X 的最大整数值<br>
                                用法:<br>
                                mysql: select floor(-1.001) value<br>
                                oracle: select floor(-1.001) value from dual<br>
                                 </td>
                </tr>
<tr>
<td>
                                5</td>
                        <td>
                                Max(expr)/Min(expr)</td>
                        <td>
                                Max(expr)/Min(expr)</td>
                        <td>
                                功能:返回 expr 的最小或最大值。MIN() 和 MAX() 可以接受一个字符串参数;在这<br>
                                种情况下,它们将返回最小或最大的字符串传下。<br>
                                用法: <br>
                                ROACLE: select max(user_int_key) from sd_usr;<br>
                                MYSQL: select max(user_int_key) from sd_usr;</td>
                </tr>
<tr>
<td>
                                6</td>
                        <td rowspan="11">
                                字符串函数</td>
                        <td>
                                ascii(str)</td>
                        <td>
                                ascii(str)</td>
                        <td>
                                功能:返回字符串 str 最左边的那个字符的 ASCII 码值。如果 str 是一个空字符串,<br>
                                那么返回值为 0。如果 str 是一个 NULL,返回值也是 NULL.<br>
                                用法: <br>
                                mysql:select ascii('a') value<br>
                                oracle:select ascii('a') value from dual</td>
                </tr>
<tr>
<td>
                                7</td>
                        <td>
                                CHAR(N,...)</td>
                        <td>
                                CHAR(N,...)</td>
                        <td>
                                功能:CHAR() 以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符<br>
                                组成的字符串。NULL 值将被忽略.<br>
                                用法: <br>
                                mysql:select char(97) value<br>
                                oracle:select chr(97) value from dual<br>
                                 </td>
                </tr>
<tr>
<td>
                                8</td>
                        <td>
                                REPLACE(str,from_str,to_str)</td>
                        <td>
                                REPLACE(str,from_str,to_str)</td>
                        <td>
                                功能: 在字符串 str 中所有出现的字符串 from_str 均被 to_str 替换,然后返回这个字符串.<br>
                                用法: <br>
                                mysql: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value <br>
                                oracle: SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual<br><br>
                                 </td>
                </tr>
<tr>
<td>
                                9</td>
                        <td>
                                INSTR('sdsq','s',2)</td>
                        <td>
                                INSTR('sdsq','s')</td>
                        <td>
                                参数个数不同<br>
                                ORACLE: select INSTR('sdsq','s',2) value from dual(要求从位置2开始)<br>
                                MYSQL: select INSTR('sdsq','s') value(从默认的位置1开始)</td>
                </tr>
<tr>
<td>
                                10</td>
                        <td>
                                SUBSTR('abcd',2,2)</td>
                        <td>
                                substring('abcd',2,2)</td>
                        <td>
                                函数名称不同:<br>
                                ORACLE: select substr('abcd',2,2) value from dual<br>
                                MYSQL: select substring('abcd',2,2) value</td>
                </tr>
<tr>
<td>
                                11</td>
                        <td>
                                instr(‘abcdefg','ab')</td>
                        <td>
                                locate(‘ab','abcdefg')</td>
                        <td>
                                函数名称不同:<br>
                                instr -&gt; locate(注意:locate的子串和总串的位置要互换)<br>
                                ORACLE: SELECT instr('abcdefg', 'ab') VALUE FROM DUAL<br>
                                MYSQL: SELECT locate('ab', 'abcdefg') VALUE</td>
                </tr>
<tr>
<td>
                                12</td>
                        <td>
                                length(str)</td>
                        <td>
                                char_length()</td>
                        <td>
                                函数名称不同:<br>
                                ORACEL: SELECT length('AAAASDF') VALUE FROM DUAL<br>
                                MYSQL: SELECT char_length('AAAASDF') VALUE</td>
                </tr>
<tr>
<td>
                                13</td>
                        <td>
                                REPLACE('abcdef', 'bcd', 'ijklmn')</td>
                        <td>
                                REPLACE('abcdef', 'bcd', 'ijklmn')</td>
                        <td>
                                一样:<br>
                                ORACLE: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value from dual<br>
                                MYSQL: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value</td>
                </tr>
<tr>
<td>
                                14</td>
                        <td>
                                LPAD('abcd',14, '0')</td>
                        <td>
                                LPAD('abcd',14, '0')</td>
                        <td>
                                一样:<br>
                                ORACLE: select LPAD('abcd',14, '0') value from dual<br>
                                MYSQL: select LPAD('abcd',14, '0') value from dual</td>
                </tr>
<tr>
<td>
                                15</td>
                        <td>
                                UPPER(iv_user_id)</td>
                        <td>
                                UPPER(iv_user_id)</td>
                        <td>
                                一样:<br>
                                ORACLE: select UPPER(user_id) from sd_usr;<br>
                                MYSQL: select UPPER(user_id) from sd_usr;</td>
                </tr>
<tr>
<td>
                                16</td>
                        <td>
                                LOWER(iv_user_id)</td>
                        <td>
                                LOWER(iv_user_id)</td>
                        <td>
                                一样:<br>
                                ORACLE: select LOWER(user_id) from sd_usr;<br>
                                MYSQL: select LOWER(user_id) from sd_usr;</td>
                </tr>
<tr>
<td>
                                17</td>
                        <td rowspan="2">
                                控制流函数</td>
                        <td>
                                nvl(u.email_address, 10)</td>
                        <td>
                                IFNULL(u.email_address, 10)<br>
                                或<br>
                                ISNULL(u.email_address)</td>
                        <td>
                                函数名称不同(根据不同的作用进行选择):<br>
                                ORACLE: select u.email_address, nvl(u.email_address, 10) value from sd_usr u (如果u.email_address=NULl,就在DB中用10替换其值)<br>
                                MYSQL: select u.email_address, IFNULL(u.email_address, 10) value from sd_usr u(如果u.email_address=NULl,显示结果中是10,而不是在DB中用10替换其值)<br>
                                select u.email_address, ISNULL(u.email_address) value from sd_usr u(如果u.email_address是NULL, 就显示1&lt;true&gt;,否则就显示0&lt;false&gt;)</td>
                </tr>
<tr>
<td>
                                18</td>
                        <td>
                                DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL)</td>
                        <td>
                                无,请用IF或CASE语句代替.<br>
                                IF语句格式:(expr1,expr2,expr3)</td>
                        <td>
                                说明: <br>
                                1. decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)<br>
                                该函数的含义如下:<br>
                                IF 条件=值1 THEN<br>
                                    RETURN(翻译值1)<br>
                                ELSIF 条件=值2 THEN<br>
                                    RETURN(翻译值2)<br>
                                    ......<br>
                                ELSIF 条件=值n THEN<br>
                                    RETURN(翻译值n)<br>
                                ELSE<br>
                                    RETURN(缺省值)<br>
                                END IF<br><br>
                                2. mysql If语法说明<br>
                                功能: 如果 expr1 是TRUE (expr1 &lt;&gt; 0 and expr1 &lt;&gt; NULL),则IF()的返回值为expr2;<br>
                                否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在<br>
                                语境而定。<br>
                                用法: <br>
                                mysql: SELECT IF(1&gt;2,2,3);</td>
                </tr>
<tr>
<td>
                                19</td>
                        <td rowspan="4">
                                类型转换函数</td>
                        <td>
                                TO_CHAR(SQLCODE)</td>
                        <td>
                                date_format/ time_format</td>
                        <td>
                                函数名称不同<br>
                                SQL&gt; select to_char(sysdate,'yyyy-mm-dd') from dual;<br>
                                SQL&gt; select to_char(sysdate,'hh24-mi-ss') from dual;<br>
                                mysql&gt; select date_format(now(),'%Y-%m-%d');<br>
                                mysql&gt; select time_format(now(),'%H-%i-%S');</td>
                </tr>
<tr>
<td>
                                20</td>
                        <td>
                                to_date(str,format)</td>
                        <td>
                                STR_TO_DATE(str,format)</td>
                        <td>
                                函数名称不同:<br>
                                ORACLE:SELECT to_date('2009-3-6','yyyy-mm-dd') VAULE FROM DUAL<br>
                                MYSQL: SELECT STR_TO_DATE('2004-03-01', '%Y-%m-%d') VAULE</td>
                </tr>
<tr>
<td>
                                21</td>
                        <td>
                                trunc(-1.002)</td>
                        <td>
                                cast(-1.002 as SIGNED)</td>
                        <td>
                                函数名称不同:<br>
                                TRUNC函数为指定元素而截去的日期值。<br>
                                ORACLE: select trunc(-1.002) value from dual<br>
                                MYSQL:select cast(-1.002 as SIGNED) value<br>
                                MYSQL:<br>
                                字符集转换 :   CONVERT(xxx  USING   gb2312)<br>
                                类型转换和SQL Server一样,就是类型参数有点点不同  : CAST(xxx  AS   类型)  ,   CONVERT(xxx,类型),类型必须用下列的类型:<br>
                                 <br>
                                  可用的类型   <br>
                                  二进制,同带binary前缀的效果 : BINARY   <br>
                                  字符型,可带参数 : CHAR()    <br>
                                  日期 : DATE    <br>
                                  时间: TIME    <br>
                                  日期时间型 : DATETIME    <br>
                                  浮点数 : DECIMAL     <br>
                                  整数 : SIGNED    <br>
                                  无符号整数 : UNSIGNED  </td>
                </tr>
<tr>
<td>
                                22</td>
                        <td>
                                TO_NUMBER(str)</td>
                        <td>
                                CAST("123" AS SIGNED INTEGER)</td>
                        <td>
                                函数名称不同<br>
                                ORACLE:SELECT TO_NUMBER('123') AS VALUE FROM DUAL;<br>
                                MYSQL: SELECT CAST("123" AS SIGNED INTEGER) as value;<br>
                                SIGNED INTEGER:带符号的整形</td>
                </tr>
<tr>
<td>
                                23</td>
                        <td rowspan="4">
                                日期函数</td>
                        <td>
                                SYSDATE</td>
                        <td>
                                now() / SYSDATE()</td>
                        <td>
                                写法不同:<br>
                                ORACLE:select SYSDATE value from dual<br>
                                MYSQL:select now() value<br>
                                select sysdate() value</td>
                </tr>
<tr>
<td>
                                24</td>
                        <td>
                                Next_day(sysdate,7)</td>
                        <td>
                                自定义一个函数:F_COMMON_NEXT_DAY(date,int)</td>
                        <td>
                                函数名称不同:<br>
                                ORACLE: SELECT Next_day(sysdate,7) value FROM DUAL<br>
                                MYSQL: SELECT F_COMMON_NEXT_DAY(SYSDATE(), 3) value from DUAL;<br>
                                (3:指星期的索引值)返回的指定的紧接着下一个星期的日期</td>
                </tr>
<tr>
<td>
                                25</td>
                        <td>
                                ADD_MONTHS(sysdate, 2)</td>
                        <td>
                                DATE_ADD(sysdate(), interval 2 month)</td>
                        <td>
                                函数名称不同:<br>
                                ORACLE: SELECT ADD_MONTHS(sysdate, 2) as value from DUAL;<br>
                                MYSQL: SELECT DATE_ADD(sysdate(), interval 2 month) as value from DUAL;</td>
                </tr>
<tr>
<td>
                                26</td>
                        <td>
                                2个日期相减(D1-D2)</td>
                        <td>
                                DATEDIFF(date1,date2)</td>
                        <td>
                                功能: 返回两个日期之间的天数。<br>
                                用法:<br>
                                mysql: SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate<br>
                                oracle: 直接用两个日期相减(比如d1-d2=12.3)</td>
                </tr>
<tr>
<td>
                                27</td>
                        <td rowspan="5">
                                SQL函数</td>
                        <td>
                                SQLCODE</td>
                        <td>
                                MYSQL中没有对应的函数,但JAVA中SQLException。getErrorCode()函数可以获取错误号</td>
                        <td>
                                Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。<br>
                                MYSQL: 可以从JAVA中得到错误代码,错误状态和错误消息</td>
                </tr>
<tr>
<td>
                                28</td>
                        <td>
                                SQLERRM</td>
                        <td>
                                MYSQL中没有对应的函数,但JAVA中SQLException。getMessage()函数可以获取错误消息</td>
                        <td>
                                Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。<br>
                                MYSQL: 可以从JAVA中得到错误代码,错误状态和错误消息</td>
                </tr>
<tr>
<td>
                                29</td>
                        <td>
                                SEQ_BK_DTL_OPT_INT_KEY.NEXTVAL</td>
                        <td>
                                自动增长列</td>
                        <td>
                                在MYSQL中是自动增长列. 如下方法获取最新ID:<br>
                                  START TRANSACTION;    <br>
                                    INSERT INTO user(username,password)<br>
                                      VALUES (username,MD5(password));<br>
                                    SELECT LAST_INSERT_ID() INTO id;<br>
                                  COMMIT;</td>
                </tr>
<tr>
<td>
                                30</td>
                        <td>
                                SUM(enable_flag)</td>
                        <td>
                                SUM(enable_flag)</td>
                        <td>
                                一样:<br>
                                ORCALE: SELECT SUM(enable_flag) FROM SD_USR;<br>
                                MYSQL: SELECT SUM(enable_flag) FROM SD_USR;</td>
                </tr>
<tr>
<td>
                                31</td>
                        <td>
                                DBMS_OUTPUT.PUT_LINE(SQLCODE)</td>
                        <td>
                                在MYSQL中无相应的方法,其作用是在控制台中打印,用于测试,对迁移无影响。</td>
                        <td>
                                dbms_output.put_line每行只能显示255个字符,超过了就会报错</td>
                </tr>
</tbody></table>
頁: [1]
查看完整版本: MySQL与Oracle差异比较之三 函数