제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under jQuery
# ng-if
 ng-if  구문안의 조건이 맞으면 본인을 show 틀리면 hide
<body ng-app="myApp">
                <input type="text" ng-model="sbtxt" value="">
                <div ng-if="sbtxt == 'red' ">빨강색</div>
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-switch on ~ ng-switch-when 문

 ng-switch on 에 연결된 ng-model 의 value 에 따라 ng-switch-when 조건에 설정된
 블럭들이 show/hide 됨 , 아래 예제
<body ng-app="myApp">

                <select id="sb" ng-model="sbcolor">
                    <option value="">선택</option>
                    <option value="1">red</option>
                    <option value="2">green</option>
                    <option value="3">blue</option>                                        
                </select>

                <div ng-switch  id="aa" on="sbcolor">                 
                  <div ng-switch-when="1" class="box red"></div>
                  <div ng-switch-when="2" class="box green"></div>
                  <div ng-switch-when="3" class="box blue"></div>
                  <div ng-switch-default class="box black"></div>
                </div>
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">

                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-show , ng-hide
ng-show 구문 안의 조건이 맞으면 자신을 show 틀리면 hide 한다.
ng-hide   구문안의 조건이 맞으면 자신을 hide 하고 틀리면 show 한다.
<body ng-app="myApp">

                <input type="text" ng-model="sbtxt" value="">

                <div ng-show="sbtxt=='red' ">빨강색 O</div> <!-- 참이면 보임  -->
                <div ng-hide="sbtxt=='red' ">  빨강색 X</div>  <!-- 참이면 숨김 -->
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-class
ng-class 구문안에 조건에 만족하면 선언한 클래스가 블럭에 적용된다.
ng-class = "{클래스명 : 조건 , 클래스명 : 조건 , 클래스명 : 조건.......}"
<style type="text/css">
    .red {color:#F00}
    .green {color:#0F0}
    .blue {color:#00F}
</style>
<body ng-app="myApp">
       <input type="text" ng-model="sbtxt" value="">
       <div ng-class="{red : sbtxt == 'red' , blue : sbtxt == 'blue' }">안녕하세요</div>          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>
2018/04/04 14:03 2018/04/04 14:03
Posted
Filed under Screen


70주년이 되어서야 이렇게 공중파로 인지도 높은 강사의 입에서 전파가 되었습니다.

필자 역시도 당시 생존자 증언을 그대로 들었습니다. 그 당시 현장에서는 말로 표현할수 없는 정말 믿기지 않는 상황이였기에 더더욱 죽일새끼들은 숨겨야 했었는지도 모릅니다.
히틀러도 비교가 안되는 이승만 글로벌 개새끼가 대한민국에 존재했던거 자체가 국가의 재앙이였던겁니다.
2018/04/04 12:07 2018/04/04 12:07
Posted
Filed under MSSQL
MSSQL 프로그래밍에세  꽤나 많은 부분을 CRUD 구현하는데, 많은 문장을 작성해 나간다.
WITH 가 Select 에 최적화되어 있다면 MERGE 조인된 테이블의 Insert / Update /Delete 를 구현하는데 최적화 되어있다고 보면 좋겠다.

# MERGE 의 기본 문법 및 의미
MERGE  [Target_Table]  AS TT   -- TT 는 [Target_Table] 의 alias
USING  [Source_Table]  AS TS   -- TS 는 [Source_Table]의 alias
ON ( TT.Column1 = TS.Column1 )  

WHEN MATCHED 
          THEN  [Target_Table]에 대한 처리

WHEN NOT MATCHED BY TARGET   AND  TS.RegDate > '2018-01-01'
           THEN 
[Source_Table] 에 있고 , [Target_Table] 에 없으면, [Target_Table] 에  Insert / Update

WHEN 
NOT MATCHED  BY SOURCE  AND  TT.RegDate < '2018-01-01'
          
THEN  [Source_Table] 에 없고,  [Target_Table] 에 있으면,   [Target_Table]  꺼 처리  Delete / Update

OUTPUT   $action , inserted.* , deleted.*  ;   //  로그보기  MERGE문의 종료는  반디스 세미콜론을  해주어야 한다.
(inserted 는 insert / update 둘다의 의미를 가지고 있으므로 , 따로 updated는 없다.)


2개의 연관된 테이블의 데이터가 "NOT MATCHED" 이긴한데 명시적으로 아래와같이 이용때
  BY TARGET   :  Source 에는 있고, Target 에 없으면
  BY SOURCE  :  Source 에는 없고, Target 에 있을때

 주의  :  WHEN MATCHED 를 제외하고  WHEN NOT MATCHED BY TARGET  처리시  WHEN NOT MATCHED  BY SOURCE 조건도 만족한다면 2개처리한다.   (WHEN MATCHED 를 제외)
1개의 WHEN 조건을 처리하고 종료하는 구조가 아님 , TARGET 과 SOURCE를 2개다 처리하게된다.

예를 들어 BY TARGET 처리 후 BY SOURCE 조건도 만족한다면 SOURCE 조건도 처리함 (코드의 순서와 관계없음)




# 테스트 테이블 및 데이터 만들기
-- 테이블 생성
create table #tbl1 (
 idx tinyint ,  name varchar(20) )
create table #tbl2 ( idx tinyint ,  name varchar(20) )


-- 더미 INSERT
insert #tbl1 values( 1 , 'aaa')
insert #tbl1 values( 2 , 'bbb')

insert #tbl2 values( 3 , 'ccc')
insert #tbl2 values( 4 , 'ddd')
insert #tbl2 values( 5 , 'eee')

-- 데이터 확인
select * From #tbl1
go
select * From #tbl2


# 간략하게 MERGE 이용
MERGE #tbl2 As TT -- Target
USING #tbl1 As TS -- Source
ON (TT.idx = TS.idx)
-- Source 에는 있고 Target 에 있으면, Source 참조로 UPDATE
WHEN MATCHED 
THEN UPDATE SET TT.NAME = TS.NAME
WHEN NOT MATCHED -- BY TARGET 생략시  NOT MATCHED BY TARGET  과 동일
THEN INSERT (idx ,name ) values(TS.idx , TS.name)




# BY TARGET  ,BY SOURCE 를 이용하여, 명시적으로처리
MERGE #tbl2 TT -- Target
USING #tbl1 TS -- Source
ON (TT.idx = TS.idx)
-- Source 에는 있고 Target 에 있으면, Source 참조로 UPDATE
WHEN MATCHED 
THEN UPDATE SET TT.NAME = TS.NAME

-- Source 에는 있고 Target 에 없으면, Source 참조로 Target 에INSERT
WHEN NOT MATCHED BY TARGET  -- AND TS.idx = 5  조건 추가 할 수 있음
THEN INSERT (idx ,name ) values(TS.idx , TS.name)

-- Source 에는 없고, Target 에 있으면 Target 에 Delete or Update
WHEN NOT MATCHED BY SOURCE -- AND TT.idx  >= 2 조건 추가 할 수있음
THEN Delete   -- or THEN UPDATESet idx = 1000 
OUTPUT   $action , inserted.* ,   deleted.*;   -- 로그사용

위 쿼리 실행 


[#tbl1 과 #tbl2 원본 Select]



[위의 Merge 실행후 Log]



[최종결과]
빨강네모 -  NOT MATCHED BY TARGET   - Insert
파랑네모 - NOT MATCHED BY SOURCE  - Delete




[최종결과]

빨강네모 -  NOT MATCHED BY TARGET   를 통해 Insert 만하고 종료하지 않고 ,
파랑네모 - NOT MATCHED BY SOURCE  조건도 만족하는것을 감지하는순간 Delete 도 동시에 처리한다.

정리하자면,
일단 Merge ~ Using ~ On 조건을 통해 Not Matched 조건이 발생하면 1개의 Not Matched(BY TARGET) 의 조건만
처리하지 않고, 
처리 후 다른 Not Matched(BY SOURCE) 조건에 만족하면 연속해서 발생한다.
( 위에 2조건을 만족하게되면 MATCHED 도 만족하게 되지만,  MATCHED 는 일어나지 않음 )
2018/04/02 18:27 2018/04/02 18:27