14강. 식의 작성 (2) - 연산자 #2
메모 Is와 Like 연산자는 위에 언급한 표의 내용과 다릅니다. Is와 Like 연산자를 이용하여 좀더
명확하게 비교할 수 있습니다.
두 식을 비교할 때 식이 숫자인지 문자열인지 결정하지 않아도 됩니다. 아래 표는 각 식이 Variant가 아닐 경우에 어떻게
비교가 일어나는지 보여 줍니다.
조 건 |
결 과 |
두 식이 숫자 데이터 형식 (Byte, Boolean, Integer, Long, Single, Double, Date,
Currency, Decimal)일 경우 |
숫자를 비교합니다. |
두 식이 문자열일 경우 |
문자열 비교를 수행합니다. |
한 식이 숫자 데이터 형식이고 다른 식이 수의 Variant일 경우 |
숫자를 비교합니다. |
한 식이 숫자 데이터 형식이고 다른 식이 숫자로 변환되지 않는 문자열 Variant일 경우 |
“형식이 일치하지 않습니다.”라는 오류가 발생합니다. |
한 식이 String이고 다른 식이 Null이 아닌 데이터 형식의 Variant일 경우 |
문자열 비교를 수행합니다. |
한 식이 Empty이고 다른 식이 숫자 데이터 형식일 경우 |
Empty 식을 0으로 놓고 숫자를 비교합니다. |
한 식이 Empty이고 다른 식이 String일 경우 |
Empty 식을 길이가 0인 문자열("")로 놓고 문자열을 비교합니다. |
expression1과 expression2이 모두 Variant 식일 경우 그의 하부
형식에 의해 비교가 수행됩니다. 아래 표는 Variant의 하부 형식에 따라 식이 어떻게 비교되고, 그 비교 결과가
어떻게 되는지 보여 줍니다.연산자 종류
조 건 |
결 과 |
두 Variant 식이 숫자일 경우 |
숫자를 비교합니다. |
두 Variant 식이 문자열일 경우 |
문자열을 비교합니다. |
한 Variant 식이 숫자이고 다른 식은 문자열일 경우 |
수식이 문자식보다 작습니다. |
한 Variant 식이 Empty이고 다른 식이 숫자일 경우 |
Empty 식을 0으로 생각하고 숫자를 비교합니다. |
한 Variant 식이 Empty이고 다른 식이 문자열일 경우 |
Empty 식을 길이가 0인 문자열("")로 놓고 문자열을 비교합니다. |
두 Variant 식이 Empty일 경우 |
두 식은 같습니다. |
Single과 Double을 비교할 때 Double은 Single로
반올림됩니다.
Currency와 Single 또는 Double을 비교할 경우 Single과
Double은 Currency로 변환됩니다. 마찬가지로 Decimal과 Single
또는 Double을 비교하면 Single과 Double은 Decimal로
변환됩니다. Currency의 경우 .0001보다 작은 소수점 값은 없어지고 Decimal의 경우
1E-28보다 작은 값은 없어지거나 초과 오류가 발생합니다. 이렇게 소수점 값이 없어지는 경우 때문에 실제로 다른 값이 같게 나타날
수도 있습니다.
Like 연산자
Like 연산자는 모든 비교 연산자와 우선 순위가 같지만 실제로는 패턴 일치 연산자입니다.
Like 연산자 예제
아래 예제에서는 Like 연산자를 사용하여 문자열의 패턴을 비교합니다.
Dim MyCheck
MyCheck = "aBBBa" Like "a*a" “ True를 반환합니다.
MyCheck = "F" Like "[A-Z]" “ True를 반환합니다.
MyCheck = "F" Like "[!A-Z]" “ False를 반환합니다.
MyCheck = "a2a" Like "a#a" “ True를 반환합니다.
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" “ True를 반환합니다.
MyCheck = "BAT123khg" Like "B?T*" “ True를 반환합니다.
MyCheck = "CAT123khg" Like "B?T*" “ False를 반환합니다.
Is 연산자
Is 연산자는 개체 참조 상황을 비교하는 연산자입니다. 이 연산자는 개체나 개체 값을 비교하는 게 아니라 두 개체가
같은 개체를 참조하는가만 검사하는 연산자입니다.
Is 연산자 예제
아래 예제에서는 Is 연산자를 사용하여 두 개의 개체 참조를 비교합니다. 개체 변수 이름은 일반적인 이름이며, 예를 들기 위해서만
사용합니다.
Dim MyObject, YourObject, ThisObject, OtherObject, ThatObject, MyCheck
Set YourObject = MyObject “ 개체 참조를 지정합니다.
Set ThisObject = MyObject
Set ThatObject = OtherObject
MyCheck = YourObject Is ThisObject
“ True를 반환합니다.
MyCheck = ThatObject Is ThisObject
“ False를 반환합니다.
“ MyObject를 가정합니다 <> OtherObject
MyCheck = MyObject Is ThatObject
“ False를 반환합니다.
MyCheck = MyObject Is Nothing
“MyObject가 Setting이 안되어 있으면 False.
그러나
아래 식을 사용하면 오류가 발생한다고 질문을 하시는 분들이 많이 있습니다.
If [필드 또는 컨트롤] Is Null then
…
End If
액세스 모듈에서 조건문을 작성할 때는 Is 연산자 양측의 두
개체를 비교하는 연산자로 사용되기 때문에 양측에 개체가 요구되면 따라서 다음과 같이 ‘개체가 필요’ 하다는 오류를 발생합니다.
참고] Null인가 아닌가는 IsNull()이란
함수를 사용해서 확인해야 합니다.
If IsNull([필드 또는 컨트롤]) then
…
End If
테이블의 속성이나 폼, 보고서, 데이터 액세스 페이지에서 개체/컨트롤의 속성의 표현식에
사용할 때는 Is Null 표현식은 오류없이 사용할 수 있습니다. 이러한 조건식은 질의문에서도
오류없이 사용됩니다.
참고] 보조적인 비교 연산자인 Is와 Like는 Select Case 문에서는 비교하는 연산자로서 사용될 수
없습니다.
문자열 연결 연산자 ( &, + )
& 연산자와 + 연산자를 혼동해서는 안됩니다.
& 연산자
두 식을 강제로 연결합니다
Dim MyStr
MyStr = "Hello" & " World" “ "Hello World"를 반환합니다.
MyStr = "Check " & 123 & " Check" “ "Check 123 Check"를 반환합니다.
+ 연산자
두 수를 더합니다. 또는 두 문자열을 연결합니다.
참고
+ 연산을 사용할 때 덧셈이 일어날지 문자열 연결이 일어날지 결정할 수 없을 것입니다.
이런 혼란을 없애고 코드를 명확하게 만들기 위해 & 연산자를 사용합니다.
두 식 중에서 한 식이라도 Variant가 아니면, 아래 규칙이 적용됩니다.
조 건 |
결 과 |
두 식이 모두 숫자 데이터 형식 (Byte, Boolean, Integer, Long, Single, Double, Date,
Currency, Decimal)일 경우 |
더합니다. |
두 식이 모두 문자열일 경우 |
연결합니다. |
한 식이 숫자 데이터 형식이고 다른 데이터 형식이 Null이 아닌 데이터 형식의 Variant일 경우 |
더합니다. |
한 식이 문자열이고 다른 데이터 형식이 Null이 아닌 Variant일 경우 |
연결합니다. |
한 식이 Empty Variant일 경우 |
남아 있는 식을 바꾸지 않고 result로 반환합니다. |
한 식이 숫자 데이터 형식이고 다른 식은 문자열일 경우 |
“형식이 일치하지 않습니다”라는 오류가 발생합니다. |
어느 한 식이 Null일 경우 |
result는 Null입니다. |
두 식이 모두 Variant 식일 경우 아래 규칙을 따릅니다.
조 건 |
결 과 |
두 Variant 식이 모두 숫자일 경우 |
더합니다. |
두 Variant 식이 모두 문자열일 경우 |
연결합니다. |
한 Variant 식이 숫자이고, 다른 식이 문자열일 경우 |
더합니다. |
예를 들어, “abc”라는 문자열과 숫자형식의 1,2를 붙여서 abc12라는 문자열을 만들고자 한 경우
? "abc" + 1+2 결과> 형식 불일치 오류 : 숫자 덧셈 => 문자열이 있어서 오류
? "abc" & 1+2 결과> abc3 (1+2) 덧셈 후 문자열 연결
? "abc" + “1” + ”2” 결과> abc12 문자열 연결
? "abc" & 1 & 2 결과> abc12 문자열 연결
또 Null값이 포함될 때
? "abc" & 1 + Null 결과> abc1 문자열 연결로 계산
? "abc" + Null 결과> Null 문자열 덧셈으로 계산
? "abc" & 1 & Null 결과> abc1
? "abc" + 1 + Null 결과> 형식 불일치 오류 : 숫자 덧셈 => 문자열이 있어서 오류
<형식불일치 오류메시지 창>
논리 연산자 (And, Eqv, Imp, Not, Or, Xor)
And 연산자: 두 식이 논리적으로 다른지 비교합니다.
Eqv 연산자: 두 식의 논리합을 구합니다.
Imp 연산자: 두 식의 논리적 함축성을 구합니다.
Not 연산자: 논리결과의 반대 결과를 구합니다.
Or 연산자: 두 식이 논리적으로 동등한지 비교합니다.
Xor 연산자: 두 식의 논리곱을 구합니다.
값 범위를 따지는 연산자
>, <, >=, <=, <>, or Between...And
식 |
결 과 |
> 234 |
Quantity 필드에서 숫자가 234보다 큽니다. |
< 1200.45 |
UnitPrice 필드에서 숫자가 1200.45보다 작습니다. |
>= "Callahan" |
LastName 필드에서 이름의 범위는 Callahan에서 알파벳 끝까지에 해당됩니다. |
Between #1999/2/2# And #1999/12/1# |
OrderDate 필드에서 날짜가 1999년 2월 2일에서 1999면 12월 1일까지에 해당됩니다(ANSI-89). |
Between “1999/2/2” And “1999/12/1” |
OrderDate 필드에서 날짜가 1999년 2월 2일에서 1999년 12월 1일까지에 해당됩니다.
(ANSI-92 사양으로 ANSI-89 사양에서는 오류가 발생합니다.) |
참고] ANSI SQL 쿼리 모드에는 2가지가 있습니다.
ANSI-89 : 일반적인 Jet SQL 구문을 얘기합니다. 이 모드는 ANSI-89 수준 1 사양에 거의 일치하지만 ANSI-89
수준 1 규격은 아닙니다. 일부 ANSI-89 SQL 기능은 구현되지 않으며 와일드카드 문자는 SQL이 아닌 VBA 사양에
일치합니다.
ANSI-92 : 쿼리, 필터, SQL 문을 만드는 기능 향상에 도움이 되는 새 예약어와 구문 규칙, 와일드카드 문자를
제공합니다. 이 모드는 ANSI-92 수준 1 사양에 거의 일치하지만 ANSI-92 수준 1 규격은 아닙니다. 이 쿼리에는 ANSI
구문적인 요소가 더 많으며 와일드카드 문자는 SQL 사양과 일치합니다.
|