본문 바로가기
2021 04 28 - 비동기로 외부 라이브러리가 올라올때까지 기다린후, 최초 1회 실행하기 외부 GA라이브러리가 올라올때까지 기다린후에 이벤트를 전송해야 했다. 동작의 목표는 1) CDN에서 GA스크립트를 로딩될때까지 기다린후, 2) ga객체의 메서드를 1회만 호출하는것. setInterval로 2초동안 ga가 불러와졌는지 주기적으로 확인후.. 올라오지 않았다면 return setTimeout으로 10초후에 Interval이 끝나도록 했다. 익명함수 안에서 scope를 유지하게끔 클로저 패턴을 사용해봤다.. var ckGaInterval = setInterval( (function(){ var firstCall = true return function(){ try{ ga//외부 라이브러리의 객체 }catch(e){ return } if(firstCall){ var run = (function(.. 2021. 4. 28.
2021 04 23 - sqlBooster JOIN JOIN JOIN JOIN INNER-JOIN SQL의 WHERE절에는 필터 조건과 조인 조건이 존재한다. 필터 조건은 FROM 절의 테이블에서 필요한 데이터를 걸러내는 역할을 한다. JOIN 조건은 두개의 테이블을 연결하는 역할을 한다. 필터 조건을 만족한 데이터만 조인에 참여한다. 또한 조인을 만족하는 데이터만 결과에 나올 수 있다. 같은 값을 가진 데이터끼리 조인하는것이 아니라, 조인 조건을 만족하는 데이터간에 조인이 이루어지는 것임을 명심하자. 여러 테이블간의 조인 아무리 많은 테이블을 조인해도 결국은 두 데이터 지합의 조인을 계속하는것에 불과하다. 테이블/필터링을 거친 테이블/두개의 데이터 집합을 조인한 결과 도 결국 데이터 집합이라고 불 수 있다. 테이블 간의 관계를 이해하고 조인을 작성하자. !!!! 필터링 .. 2021. 4. 23.
2021 04 23 - SQL Booter COUNT의 비밀 COUNT의 비밀 COUNT는 NULL을 0으로 카운트 한다. 집계에서 제외될것 같았는데 의외다. WHERE 조건식에서 NULL이 boolean값으로 판단되지 않는거와 비교하면 사뭇 다르다. select count(col1) cnt_col1 ,count(col2) cnt_col2 ,count(col3) cnt_col3 from( select 'A' col1, NULL col2, 'C' col3 from dual union all select 'B' col1, NULL col2, NULL col3 from dual ) t1; COUNT(*)과 COUNT(컬럼명) COUNT(*) 는 로우 자체의 개수를 카운트 한다. select count(*) test1, coun.. 2021. 4. 23.
2021 04 22 - SQL Booster : GROUP BY Holic GROUP BY 쿼리의 규칙 GROUP BY에 사용한 컬럼만 SELECT 할 수 있다. GROUP BY에서 사용하지 않은 컬럼을 SELECT 하기 위해서는 집계 함수를 사용해야 한다. GROUP BY 에도 CASE문을 사용 할 수 있다 ! 예를들어.. 특정 컬럼의 값에 따라서 그룹을 나눌 수 있다!. GROUP BY ORD_ST, CASE WHEN ORD_AMT >= 5000 THEN 'High Order' WHEN ORD_AMT >= 3000 THEN 'Middle Order' ELSE 'Low Order' END GROUP BY 안에서도 연산을 사용할 수 있다는게 조금 신선하게 다가온다. 집계 함수에서 GROUP BY 사용하기 SELECT TO_CHAR(ORD_DT,'YYYYMM') ORD_YM , .. 2021. 4. 22.
2021 04 16 날짜와 시간을 모두 포함하는 컬럼에서 날짜 범위를 올바르게 검색하는 방법 날짜 형식을 명확하게 기술해야 한다. yyyy-mm-dd, yyyymmdd나 yyyy-mm-dd hh:mm:ss[.nnn]처럼 -> 국가마다 날짜 형식이 다르기 때문이다. 묵시적 날짜 변환 기능에 의존하지 말고, 명시적으로 날짜 변환 함수를 사용하는것이 좋다. 7/4일 하루의 에러 로그를 보고싶다. 쿼리를 짜보자. WHERE L.logDate = CASE('7/4/2016' AS datetime) -- XXX WHERE L.logDate = CONVERT(datetime, '2016-07-04', 120)하지만 위 쿼리의 실행 결과는 반환되는 결과가 없을것이다. LogDate 컬럼을 datetime 이라.. 2021. 4. 16.
2021 04 09 일치하지 않거나 누락된 레코드를 찾아내자. 판매되지 않은 상품 찾아내기. 가장 쉬운방법은 서브쿼리로 판매된 제품목록을 구한 후, 전체 상품목록에서 판매된 제품 목록을 제외하는것(NOT IN)이다. 이 쿼리는 이해하기 쉽지만 실행계획이 효율적이지 않다. 왜냐하면, 서브쿼리에서 Order_Details 테이블 전체를 검색해 판매된 제품목록을 가져와서, Products 테이블의 각 ProductNumber값을 하나,하나, 비교해야한다. 이보다 더 효율적인 방법이 있다. 서브쿼리가 적어도 하나의 열을 반환하는지 확인하는 EXISTS연산자를 사용하는것이다. 쿼리 엔진지 조건에 일치하는 레코드를 발견하면, 동일한 레코드에서는 이후 비교 작업을 더이상 진행하지 않기때문이다. CASE로 문제를 해결할 때를 파악하자. .. 2021. 4. 16.