MySQL이 Oracle 데이터베이스로 전환할 때 흔히 볼 수 있는 함수 변환 및 일부 변동 방법
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
//
당분간은 이렇게 많으니까 나중에 있으면 내가 더 넣을게.
여러분들이 다른 함수를 만났으면 댓글로 남겨주세요.
여러분의 메모를 환영합니다.
끝(아니야, 난 그냥 이 색깔로 하고 싶어...)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
보조금 신청서 작성이 자습서에서는 사용자가 보조금을 신청할 수 있는 애플리케이션을 빌드하는 방법을 보여줍니다. 이 게시물에서는 MySQL 데이터베이스에 연결, SQL 연결, 암호 해싱 및 코드 기반 모듈화와 같은 개념을 보여줍니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.