MySQL이 Oracle 데이터베이스로 전환할 때 흔히 볼 수 있는 함수 변환 및 일부 변동 방법

1. 시간 형식
MySQL:
select city_name,DATE_FORMAT(insert_time,'%Y-%m-%d %H:%i:%s') as insert_time from tb_lte_bts

Oracle:
select city_name,to_char(insert_time, 'yyyy-MM-dd hh24:mi:ss')as insert_time from tb_lte_bts

또는
select city_name,to_date(insert_time, 'yyyy-MM-dd hh24:mi:ss')as insert_time from tb_lte_bts

그때는 정확하게 당신의 필드 저장 유형과 길이를 보고 변경해야 합니다.
 
2. MySQL의 조회 SQL의where 조건에서 다음과 같은 상황을 만날 수 있다

    = #{staStartDate1} ]]>


    

이것은 Oracle에서 다음과 같이 변경할 수 있는 SQL 쿼리의 시간 범위에 대한 판단입니다.

    = to_date(#{staStartDate1},'yyyy-MM-dd hh24:mi:ss') ]]>


    

물론 이것은 yyy-MM-ddhh24:mi:ss가 죽은 형식이 아니라 실제 전달된 내용의 과립도에 따라 언제까지 정확하게 변경해야 하는지 주의해야 한다.
 
3. 결합 함수 concat ()
MySQL:
select  
    id,role_name, remark,status
from 
    sys_lte_role
where 
    1=1

    AND id = #{id}


    AND role_name like concat(concat('%',#{role_name} ),'%')


    AND status = #{status}

Oracle:
select
	id "id",role_name "role_name", remark "remark",status "status"
from 
    sys_lte_role
where 
    1=1

    AND id = #{id}


    AND role_name like '%' || #{role_name}  || '%'


    AND status = #{status}

 
4, 그룹 by, 정렬
함수 해석: MySQL 데이터베이스에서 우리는 정렬을 어떻게 하는지 모두 알고 있지만 Oracle에서는 그렇지 않기 때문에 특수한 조작이 필요하다.
MySQL:
SELECT
    a.cell_alarm_type,
    b.factor factor,
    CAST(b.factor_type AS signed) factor_type ,
    COUNT(1) cell_num
FROM
    tb_lte_alarm_cell_net a, tb_lte_alarm_factor b
WHERE
    a.factor_code = b.factor_code 
GROUP BY
    factor, cell_alarm_type

Oracle:
SELECT  DISTINCT
    a.cell_alarm_type "cell_alarm_type",b.factor "factor",b.factor_type "factor_type",
    COUNT(*) over(partition by factor, cell_alarm_type) "cell_num"
FROM
    tb_lte_alarm_cell_net a, tb_lte_alarm_factor b
WHERE
    a.factor_code = b.factor_code

이렇게 하면 돼요. DISTINCT를 꼭 넣어야 해요. 물론 카운트()가 없다고 하면 스스로 카운트()를 써요. 시간이 많이 걸리겠지만 어쩔 수 없어요.
물론 아래와 같은 해결 방법이 있지만, 아래의 이것은 좀 어려워서, 나는 이것을 섞어서 함께 썼다
다음은 이게 좀 복잡할 뿐이야.
 
5, 소수위 TRUNCATE(X, D)를 끊고,
함수 해석: 숫자 X를 반환하고 D 소수점으로 자릅니다.
MySQL:
SELECT 
    nbc.city_name,
    nbc.area,
    CONVERT(SUM(nbc.cellRetire),
    DECIMAL(28, 0)) cellRetires,
    CONVERT(SUM(nbc.netRetire),DECIMAL(28, 0)) netRetires ,
    CONCAT(TRUNCATE(sum(nbc.cellRetire) /nbcpi.cellRetireTotal*100,2),'%') cellPi,
    CONCAT(TRUNCATE(sum(nbc.netRetire) /nbcpi.netRetireTotal*100,2),'%') netPi,
    SUM(nbc.cell_num) cell_num,nbcpi.cellRetireTotal,nbcpi.netRetireTotal
FROM 
    tb_lte_alarm_data_nb_count nbc
JOIN 
    tb_lte_alarm_data_nb nbcpi ON nbcpi.city_name=nbc.city_name
WHERE 
    1=1
GROUP BY 
    nbc.city_name,nbc.area

Oracle:
SELECT
    nbc.city_name "city_name",
    nbc.area "area",
    SUM(nbc.cellRetire) over(partition by nbc.city_name, nbc.area) "cellRetires",
    SUM(nbc.netRetire) over(partition by nbc.city_name, nbc.area) "netRetires",
    TRUNC(sum(nbc.cellRetire) over(partition by nbc.city_name, nbc.area) / nbcpi.cellRetireTotal * 100, 2) || '%' "cellPi",
    TRUNC(sum(nbc.netRetire) over(partition by nbc.city_name, nbc.area) / nbcpi.netRetireTotal * 100, 2) || '%' "netPi",
    SUM(nbc.cell_num) over(partition by nbc.city_name, nbc.area) "cell_num",
    nbcpi.cellRetireTotal "cellRetireTotal",
    nbcpi.netRetireTotal "netRetireTotal",
    count(*) over(partition by nbc.city_name, nbc.area) r
FROM 
    tb_lte_alarm_data_nb_count nbc
JOIN 
    tb_lte_alarm_data_nb nbcpi ON nbcpi.city_name=nbc.city_name
WHERE 
    1=1

주: 여기서 주의해야 할 것은 SUM () 다음에 모두 정렬해야 한다는 것이다. 이 점은 AVG () 등 함수들을 포함한다.
 
6、NOW( ) + DATE_ADD()(참고: NOW() 및 DATEADD()와 함께 썼습니다.
함수 해석: NOW () 현재 타임 스탬프 가져오기
함수 해석: DATEADD(날짜, INTERVAL 숫자 간격 단위)가 특정 날짜에 지정된 간격을 더합니다.
MySQL:
SELECT
    sum( cur_net_count ) cur_net_count,
    sum( exce_count ) exce_count,
    round( sum( exce_count ) / sum( cur_net_count ) * 100, 2 ) problem_per
FROM
    tb_lte_index_count
WHERE 1=1
    
        AND create_date >= date_add(now(), interval -8 day)
    
    
        AND create_date >= date_add(now(), interval -2 day)
    
    AND create_date  date_add(now(), interval -1 day)

Oracle:
SELECT
    sum( cur_net_count ) "cur_net_count",
    sum( exce_count ) "exce_count",
    round( sum( exce_count ) / sum( cur_net_count ) * 100, 2 ) "problem_per"
FROM 
    tb_lte_index_count
WHERE
    1=1
    
        AND create_date >= trunc(sysdate)-8
    
    
        AND create_date >= trunc(sysdate)-2
    
    AND create_date  trunc(sysdate)-1

 
7、CONVERT( )
함수 해석: CONVERT() 함수는 한 유형의 값을 가져오고 다른 유형의 값을 생성하는 데 사용됩니다.
MySQL:
SELECT 
    nbc.city_name,
    nbc.area,
    CONVERT(SUM(nbc.cellRetire),
    DECIMAL(28, 0)) cellRetires,
    CONVERT(SUM(nbc.netRetire),DECIMAL(28, 0)) netRetires ,
    CONCAT(TRUNCATE(sum(nbc.cellRetire) /nbcpi.cellRetireTotal*100,2),'%') cellPi,
    CONCAT(TRUNCATE(sum(nbc.netRetire) /nbcpi.netRetireTotal*100,2),'%') netPi,
    SUM(nbc.cell_num) cell_num,nbcpi.cellRetireTotal,nbcpi.netRetireTotal
FROM 
    tb_lte_alarm_data_nb_count nbc
JOIN 
    tb_lte_alarm_data_nb nbcpi ON nbcpi.city_name=nbc.city_name
WHERE 
    1=1
GROUP BY 
    nbc.city_name,nbc.area

Oracle: 잉크 자국 없이 삭제하십시오
SELECT
    nbc.city_name "city_name",
    nbc.area "area",
    SUM(nbc.cellRetire) over(partition by nbc.city_name, nbc.area) "cellRetires",
    SUM(nbc.netRetire) over(partition by nbc.city_name, nbc.area) "netRetires",
    TRUNC(sum(nbc.cellRetire) over(partition by nbc.city_name, nbc.area) / nbcpi.cellRetireTotal * 100, 2) || '%' "cellPi",
    TRUNC(sum(nbc.netRetire) over(partition by nbc.city_name, nbc.area) / nbcpi.netRetireTotal * 100, 2) || '%' "netPi",
    SUM(nbc.cell_num) over(partition by nbc.city_name, nbc.area) "cell_num",
    nbcpi.cellRetireTotal "cellRetireTotal",
    nbcpi.netRetireTotal "netRetireTotal",
    count(*) over(partition by nbc.city_name, nbc.area) r
FROM 
    tb_lte_alarm_data_nb_count nbc
JOIN 
    tb_lte_alarm_data_nb nbcpi ON nbcpi.city_name=nbc.city_name
WHERE 
    1=1

 
8、GROUP_CONCAT( ) 
함수 해석: 어~ 게으름 피우고 싶어요. 이거 제가 전에 블로그를 썼는데 그냥, 게으름 피우고 싶어요~
https://blog.csdn.net/weixin_40836179/article/details/84860514
MySQL:
SELECT
    a.cell_alarm_sub_type,
    GROUP_CONCAT( CONCAT(a.ne_code, '#', a.cell_cde) ) id_str
FROM
    tb_lte_alarm_cell_net_his a, tb_lte_alarm_process_time b

Oracle:
SELECT
    a.cell_alarm_sub_type "cell_alarm_sub_type",
    listagg(a.ne_code || '#' || a.cell_code) within group(order by priority ASC) "id_str"
FROM
    tb_lte_alarm_cell_net_his a, tb_lte_alarm_process_time b

 
9. IF() 판단
MySQL: 게으름을 피우고 싶은데,
IF(LENGTH(IFNULL(d.ne_name_cn,''))=0,1,0)

Oracle:
DECODE(LENGTH(nvl(d.ne_name_cn,'')),0,1,0)

완벽해~, 하지만 주의해야 할 것은 뒤에 있는 것이 원래'=0'이었는데, 지금은',0'으로 바꿔야 한다는 것이다. 자세히 봐야 한다.
또 다른 상황은 네가 이것처럼 이렇게 고쳐야 한다는 것이다.
MySQL:
'  ' OR gps.GPS_NumberOfSatellites<4,' ',' ') AS hidden_danger_Issue ]]>

Oracle:
'  ' OR gps.GPS_NumberOfSatellites<4 then ' ' else ' ' end AS hidden_danger_Issue ]]>

 
10、LENGTH( )
MySQL:
select * from tb_lte_bts where 1=1 and( ISNULL( ne_code ) OR LENGTH( ne_code ) <= 0 )

Oracle:
select * from tb_lte_bts where 1=1 and( LENGTH( NVL( tb_lte_bts, '' ) ) <= 0 )

 
11、DATE_SUB( ) 
함수 해석: 날짜에서 지정한 시간 간격을 줄입니다.
마침 DATE 와ADD()는 반대입니다.
MySQL:
SELECT
    a.*,
    b.*
FROM
    tb_lte_alarm_day_publish a,
    tb_lte_alarm_day_publish b
WHERE
    1=1
    AND b.etl_date = (SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 DAY),'%Y-%m-%d'))

Oracle:
SELECT
    a.*,
    b.*
FROM
    tb_lte_alarm_day_publish a,
    tb_lte_alarm_day_publish b
WHERE
    1=1
    AND b.etl_date = ( SELECT to_char( sysdate - 10, 'yyyymmdd' ) )
    //  
    AND b.etl_date = ( SELECT trunc( sysdate ) - 10 )

 
12. 선착순 3위
함수 해석: MySQL에서 다음과 같은 똑같은 예를 볼 수 있다면 생각하지 마세요. 모든 그룹에 숫자를 되돌려주고 몇몇 데이터 중 3등을 뽑아서 말하자면 Oracle에서row 를 실현하고 싶어요.number () 함수.
MySQL:
select(
    @i := case  when  @pre_consec_nbr=t1.consec_nbr then @i + 1 else 1 end )  rownum, 
    t1.*,
    (@pre_consec_nbr:= t1.consec_nbr)
from tb_lte_cell t1 
inner join( SELECT  @i := 0, @pre_parent_code:='' ) AS t2

Oracle:
select
    row_number() over( partition by t1.consec_nbr order by t1.consec_nbr) rownum,
    t1.*
from tb_lte_cell t1

 
13. TIMESTAMPDIFF(HOUR, 시작 시간, 종료 시간)
함수 해석: 두 시간(시작 시간과 종료 시간)의 중간 차이를 구합니다(HOUR는 시간을 나타냅니다).
SELECT 
    count(1) cou_timely,
    etl_date AS etl_date_timely,
    city_name AS city_name_timely
FROM 
    tb_lte_alarm_day_order
WHERE 1=1 
    '  ' 
        AND city_name<>''
    ]]>
GROUP BY 
    city_name

Oracle:
SELECT 
    count(1) cou_timely,
    etl_date AS etl_date_timely,
    city_name AS city_name_timely
FROM 
    tb_lte_alarm_day_order
WHERE 1=1 
    '  ' 
        AND city_name<>''
    ]]>
GROUP BY 
    city_name

 
14. 다른 것은 주의사항이지만,
1. 예를 들어 성숙한 프로젝트에 대해 데이터베이스 이전을 할 때 모든 데이터 필드에 별명을 붙여야 한다. 만약에 프로그램의 필드를 대문자로 바꾸면 원가가 높고 프로그램의 필드를 바꾸는 것을 권장하지 않기 때문에 select 문장의 필드에 모두 별명을 붙이고 영어 더블 인덱스로 바꾸면 원가가 비교적 낮다.시간과 힘을 절약하다.
2. 다음과 같은 문장에 대해
CASE    WHEN 1 THEN '  ' END     

이러한 필드는 다음과 같이 변경해야 합니다.
CASE    WHEN '1' THEN '  ' END AS '    '

그렇지 않으면 CHAR가 실제로 받은 인스타그램이나 다른 비슷한 질문을 올릴 겁니다.
3. 시간을 조회할 때 우리는 <=또는>= 이런 것들을 사용하는데 이때 우리는 그것에 대해 약간의 수정을 해야 한다
SELECT
    *
FROM 
    tb_lte_index_count
WHERE
    1=1
    AND create_date  trunc(sysdate)-1
    //  
    

 
당분간은 이렇게 많으니까 나중에 있으면 내가 더 넣을게.
여러분들이 다른 함수를 만났으면 댓글로 남겨주세요.
여러분의 메모를 환영합니다.
끝(아니야, 난 그냥 이 색깔로 하고 싶어...)

좋은 웹페이지 즐겨찾기