SQL에서 연산자 사용
예제와 함께 따라가려면 쿼리를 실행할 샘플 데이터를 참조하여 샘플 데이터를 확인하고 OCI 콘솔을 사용하여 예제 테이블을 생성하고 JSON 파일을 사용하여 데이터를 로드하는 방법을 알아보십시오.
순서 비교 연산자
두 시퀀스 간의 비교는 =any, !=any, >any, >=any, <any, <=any 연산자 집합을 통해 수행됩니다. 두 입력 시퀀스 S1 및 S2에 대한 연산자의 결과는 i1 및 i2 항목 쌍이 있는 경우에만 true이고, 여기서 i1은 S1에 속하고, i2는 S2에 속하며, i1 및 i2는 해당 값 비교 연산자를 통해 true를 비교합니다. 그렇지 않으면 입력 시퀀스가 NULL을 포함할 경우 결과는 NULL이 됩니다. 그렇지 않은 경우 결과는 false입니다.
예 1:예상 도착 시간이 2019-03-01T13:00:00Z보다 큰 모든 가방에 대한 승객 이름 및 태그 번호를 찾습니다.
SELECT fullname, bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[].estimatedArrival
FROM BaggageInfo bag
WHERE bag.bagInfo[].flightLegs[].estimatedArrival >any "2019-03-01T13:00:00Z"
설명:예상 도착 시간이 지정된 값보다 큰 모든 승객 가방의 전체 이름과 태그 번호를 인출합니다. 여기서 ">" 연산자(bag.bagInfo[].flightLegs[].estimatedArrival)의 왼쪽에 있는 피연산자는 값의 시퀀스입니다. 시퀀스 연산자 대신 일반 비교 연산자를 사용하려고 하면 아래와 같이 오류가 발생합니다. 따라서 여기에 시퀀스 연산자가 필요합니다.
SELECT fullname, bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[].estimatedArrival
FROM BaggageInfo bag
WHERE bag.bagInfo[].flightLegs[].estimatedArrival > "2019-03-01T13:00:00Z"
오류를 표시하는 출력:
Error handling command SELECT fullname, bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].estimatedArrival
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].estimatedArrival > "2019-03-01T13:00:00Z":
Error: at (1, 107) The left operand of comparison operator > is a sequence with more than one items.
Comparison operators cannot operate on sequences of more than one items.
출력(순서 연산자 사용 후):
{"fullname":"Lucinda Beckman","tagNum":"17657806240001","estimatedArrival":["2019-03-12T16:00:00Z","2019-03-13T03:14:00Z","2019-03-12T15:12:00Z"]}
{"fullname":"Elane Lemons","tagNum":"1765780623244","estimatedArrival":["2019-03-15T09:00:00Z","2019-03-15T10:14:00Z","2019-03-15T10:14:00Z"]}
{"fullname":"Dierdre Amador","tagNum":"17657806240229","estimatedArrival":"2019-03-07T14:00:00Z"}
{"fullname":"Henry Jenkins","tagNum":"17657806216554","estimatedArrival":["2019-03-02T09:00:00Z","2019-03-02T13:24:00Z"]}
{"fullname":"Lorenzo Phil","tagNum":["17657806240001","17657806340001"],"estimatedArrival":["2019-03-12T16:00:00Z","2019-03-13T03:14:00Z",
"2019-03-12T15:12:00Z","2019-03-12T16:40:00Z","2019-03-13T03:18:00Z","2019-03-12T15:12:00Z"]}
{"fullname":"Gerard Greene","tagNum":"1765780626568","estimatedArrival":["2019-03-07T17:00:00Z","2019-03-08T04:10:00Z","2019-03-07T16:10:00Z"]}
{"fullname":"Doris Martin","tagNum":"17657806232501","estimatedArrival":["2019-03-22T09:00:00Z","2019-03-21T23:24:00Z","2019-03-22T10:24:00Z"]}
{"fullname":"Omar Harvey","tagNum":"17657806234185","estimatedArrival":["2019-03-02T02:00:00Z","2019-03-02T16:21:00Z"]}
{"fullname":"Mary Watson","tagNum":"17657806299833","estimatedArrival":["2019-03-13T15:00:00Z","2019-03-14T06:22:00Z"]}
{"fullname":"Kendal Biddle","tagNum":"17657806296887","estimatedArrival":["2019-03-04T22:00:00Z","2019-03-05T12:02:00Z"]}
예제 2:JFK를 통해/JFK를 통해 다른 위치로 이동하는 승객의 태그 번호를 찾습니다.
SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any "JFK"
설명:비행 소스가 JFK인 승객 또는 JFK를 통과하는 승객의 태그 번호를 인출합니다. 대상은 임의의 항목일 수 있습니다.
출력:
{"tagNum":"17657806240229","fltRouteSrc":"JFK"}
{"tagNum":"17657806215913","fltRouteSrc":["JFK","IST"]}
{"tagNum":"17657806296887","fltRouteSrc":["JFK","IST"]}
논리 연산자
AND 및 OR 연산자는 이진이고 NOT 연산자는 단항입니다. 논리 연산자의 피연산자는 BOOLEAN 유형을 가져야 하는 조건부 표현식입니다. 피연산자의 빈 결과는 false 값으로 처리됩니다. 피연산자가 NULL(SQL NULL 또는 JSON NULL)을 반환하는 경우 다음을 수행합니다.
-
AND 연산자는 다른 피연산자가 false를 반환하는 경우 false를 반환하고, 그렇지 않은 경우 NULL을 반환합니다.
-
다른 피연산자가 true를 반환하면 OR 연산자가 true를 반환하고, 그렇지 않으면 NULL을 반환합니다.
-
NOT 연산자는 NULL을 반환합니다.
예 1: 티켓 번호가 1762311547917이거나 확인 번호가 KN4D1L인 여행에 대한 승객 및 가방의 세부정보를 선택합니다.
SELECT fullName,bag.ticketNo, bag.confNo,
bag.bagInfo[].tagNum, bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE bag.ticketNo=1762311547917 OR bag.confNo="KN4D1L"
설명: 두 필터 기준 중 하나를 충족하는 승객의 세부정보를 인출합니다. OR 절을 사용하여 이 작업을 수행합니다. 특정 티켓 번호 또는 특정 예약 코드(confNo)를 충족하는 승객의 전체 이름, 태그 번호, 티켓 번호, 예약 코드 및 경로 지정 세부정보를 인출합니다.
출력:
{"fullName":"Rosalia Triplett","ticketNo":1762311547917,"confNo":"FH7G1W","tagNum":"17657806215913","routing":"JFK/IST/VIE"}
{"fullName":"Mary Watson","ticketNo":1762340683564,"confNo":"KN4D1L","tagNum":"17657806299833","routing":"YYZ/HKG/BLR"}
예 2: MIA와 MEL 사이를 이동하는 승객의 수하물 세부정보를 선택합니다.
SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE bag.bagInfo[].flightLegs[].fltRouteSrc =any "MIA" AND
bag.bagInfo[].flightLegs[].fltRouteDest=any "MEL"
설명:MIA와 MEL 사이를 이동하는 승객의 세부정보를 인출합니다. 여기에 두 가지 조건, 비행 소스 및 비행 목적지를 일치시켜야 하므로 AND 연산자를 사용합니다. 여기에서 비행원은 비행의 출발점 또는 모든 교통 공항이 될 수 있습니다. 마찬가지로, 비행 목적지는 수송 공항 또는 최종 목적지가 될 수 있습니다.
출력:
{"fullName":"Zulema Martindale","tagNum":"17657806288937","routing":"MIA/LAX/MEL"}
{"fullName":"Adam Phillips","tagNum":"17657806255240","routing":"MIA/LAX/MEL"}
{"fullName":"Joanne Diaz","tagNum":"17657806292518","routing":"MIA/LAX/MEL"}
{"fullName":"Zina Christenson","tagNum":"17657806228676","routing":"MIA/LAX/MEL"}
예제 3:MIA/pass through MIA에서 시작되지 않는 가방의 세부정보를 선택합니다.
SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any "MIA"
설명:특정 소스에서 시작되지 않은 승객의 세부정보를 인출합니다. 이러한 세부정보를 인출하려면 여기서 NOT 연산자를 사용합니다. MIA를 통해 시작/진행하지 않은 가방의 세부정보를 인출하려고 합니다.
출력:
{"fullName":"Kendal Biddle","tagNum":"17657806296887","routing":"JFK/IST/VIE","fltRouteSrc":"JFK"}
{"fullName":"Lucinda Beckman","tagNum":"17657806240001","routing":"SFO/IST/ATH/JTR","fltRouteSrc":"SFO"}
{"fullName":"Adelaide Willard","tagNum":"17657806224224","routing":"GRU/ORD/SEA","fltRouteSrc":"GRU"}
{"fullName":"Raymond Griffin","tagNum":"17657806243578","routing":"MSQ/FRA/HKG","fltRouteSrc":"MSQ"}
{"fullName":"Elane Lemons","tagNum":"1765780623244","routing":"MXP/CDG/SLC/BZN","fltRouteSrc":"MXP"}
{"fullName":"Dierdre Amador","tagNum":"17657806240229","routing":"JFK/MAD","fltRouteSrc":"JFK"}
{"fullName":"Henry Jenkins","tagNum":"17657806216554","routing":"SFO/ORD/FRA","fltRouteSrc":"SFO"}
{"fullName":"Rosalia Triplett","tagNum":"17657806215913","routing":"JFK/IST/VIE","fltRouteSrc":"JFK"}
{"fullName":"Lorenzo Phil","tagNum":["17657806240001","17657806340001"],"routing":["SFO/IST/ATH/JTR","SFO/IST/ATH/JTR"],"fltRouteSrc":["SFO","SFO"]}
{"fullName":"Gerard Greene","tagNum":"1765780626568","routing":"SFO/IST/ATH/JTR","fltRouteSrc":"SFO"}
{"fullName":"Doris Martin","tagNum":"17657806232501","routing":"BZN/SEA/CDG/MXP","fltRouteSrc":"BZN"}
{"fullName":"Omar Harvey","tagNum":"17657806234185","routing":"MEL/LAX/MIA","fltRouteSrc":"MEL"}
{"fullName":"Fallon Clements","tagNum":"17657806255507","routing":"MXP/CDG/SLC/BZN","fltRouteSrc":"MXP"}
{"fullName":"Lisbeth Wampler","tagNum":"17657806292229","routing":"LAX/TPE/SGN","fltRouteSrc":"LAX"}
{"fullName":"Teena Colley","tagNum":"17657806255823","routing":"MSQ/FRA/HKG","fltRouteSrc":"MSQ"}
{"fullName":"Michelle Payne","tagNum":"17657806247861","routing":"SFO/IST/ATH/JTR","fltRouteSrc":"SFO"}
{"fullName":"Mary Watson","tagNum":"17657806299833","routing":"YYZ/HKG/BLR","fltRouteSrc":"YYZ"}
NULL 연산자
IS NULL 연산자는 입력 표현식(SQL 표현식 또는 JSON 객체)의 결과가 NULL인지 여부를 테스트합니다. 입력 표현식이 두 개 이상의 항목을 반환하면 오류가 발생합니다. 입력 표현식의 결과가 비어 있으면 IS NULL은 false를 반환합니다. 그렇지 않으면 입력 표현식에 의해 계산된 단일 항목이 NULL인 경우에만 IS NULL이 참을 반환합니다. IS NOT NULL 연산자는 NOT (IS NULL cond_expr)과 동일합니다.
예 1:수하물 상세내역을 사용할 수 있고 NULL이 아닌 승객의 티켓 번호를 가져옵니다.
SELECT ticketNo,fullname FROM BaggageInfo bagdet
WHERE bagdet.bagInfo is NOT NULL
설명:수하물이 있는 승객의 세부정보를 인출합니다. 즉, bagInfo JSON이 널이 아닙니다.
출력:
{"ticketNo":1762357254392,"fullname":"Teena Colley"}
{"ticketNo":1762330498104,"fullname":"Michelle Payne"}
{"ticketNo":1762340683564,"fullname":"Mary Watson"}
{"ticketNo":1762377974281,"fullname":"Kendal Biddle"}
{"ticketNo":1762320569757,"fullname":"Lucinda Beckman"}
{"ticketNo":1762392135540,"fullname":"Adelaide Willard"}
{"ticketNo":1762399766476,"fullname":"Raymond Griffin"}
{"ticketNo":1762324912391,"fullname":"Elane Lemons"}
{"ticketNo":1762390789239,"fullname":"Zina Christenson"}
{"ticketNo":1762340579411,"fullname":"Zulema Martindale"}
{"ticketNo":1762376407826,"fullname":"Dierdre Amador"}
{"ticketNo":176234463813,"fullname":"Henry Jenkins"}
{"ticketNo":1762311547917,"fullname":"Rosalia Triplett"}
{"ticketNo":1762320369957,"fullname":"Lorenzo Phil"}
{"ticketNo":1762341772625,"fullname":"Gerard Greene"}
{"ticketNo":1762344493810,"fullname":"Adam Phillips"}
{"ticketNo":1762355527825,"fullname":"Doris Martin"}
{"ticketNo":1762383911861,"fullname":"Joanne Diaz"}
{"ticketNo":1762348904343,"fullname":"Omar Harvey"}
{"ticketNo":1762350390409,"fullname":"Fallon Clements"}
{"ticketNo":1762355854464,"fullname":"Lisbeth Wampler"}
예 2: 수하물 상세내역을 사용할 수 없거나 NULL인 승객의 티켓 번호 가져오기
SELECT ticketNo, fullname FROM BaggageInfo bagdet
WHERE bagdet.bagInfo is NULL
0 row returned
값 비교 연산자
값 비교 연산자는 주로 왼쪽 피연산자에 의해 생성된 값과 오른쪽 피연산자에서 생성된 값의 두 값을 비교하는 데 사용됩니다. 피연산자가 두 개 이상의 항목을 반환하는 경우 오류가 발생합니다. 두 피연산자가 모두 빈 시퀀스를 반환하는 경우 피연산자는 같음으로 간주됩니다. 연산자가 =, <= 또는 >=인 경우 true가 반환됩니다. 피연산자 중 하나만 비어 있으면 연산자가 !=가 아니면 비교 결과가 false입니다. 피연산자가 NULL을 반환하는 경우 비교 표현식의 결과도 NULL입니다. 그렇지 않은 경우 결과는 부울 값입니다.
예 1: 모든 남성 승객의 전체 이름 및 경로 지정을 선택합니다.
SELECT fullname, bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE gender="M"
설명:여기에서 데이터가 성별을 기준으로 필터링됩니다. 값 비교 연산자 "="는 데이터를 필터링하는 데 사용됩니다.
출력:
{"fullname":"Lucinda Beckman","routing":"SFO/IST/ATH/JTR"}
{"fullname":"Adelaide Willard","routing":"GRU/ORD/SEA"}
{"fullname":"Raymond Griffin","routing":"MSQ/FRA/HKG"}
{"fullname":"Zina Christenson","routing":"MIA/LAX/MEL"}
{"fullname":"Dierdre Amador","routing":"JFK/MAD"}
{"fullname":"Birgit Naquin","routing":"JFK/MAD"}
{"fullname":"Lorenzo Phil","routing":["SFO/IST/ATH/JTR","SFO/IST/ATH/JTR"]}
{"fullname":"Gerard Greene","routing":"SFO/IST/ATH/JTR"}
{"fullname":"Adam Phillips","routing":"MIA/LAX/MEL"}
{"fullname":"Fallon Clements","routing":"MXP/CDG/SLC/BZN"}
{"fullname":"Lisbeth Wampler","routing":"LAX/TPE/SGN"}
{"fullname":"Teena Colley","routing":"MSQ/FRA/HKG"}
이 query는 "!=" 비교 연산자를 사용하여 재작성할 수 있습니다. 모든 남성 승객의 세부 정보를 얻기 위해 쿼리는 성별이 "F"가 아닌 데이터를 필터링할 수 있습니다. 이는 열 성별에 "F" 및 "M"인 두 개의 값만 있을 수 있다고 가정할 때만 유효합니다.
SELECT fullname,bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE gender!="F";
예 2: 티켓 번호가 1762360000000보다 큰 승객의 승객 이름 및 경로 지정 세부정보를 인출합니다.
SELECT fullname, ticketNo,
bag.bagInfo[].tagNum,bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE ticketNo > 1762360000000
설명:티켓 번호가 지정된 값보다 큰 승객의 세부정보가 필요합니다. ">" 연산자를 사용하여 데이터를 필터링합니다.
출력:
{"fullname":"Adelaide Willard","ticketNo":1762392135540,"tagNum":"17657806224224","routing":"GRU/ORD/SEA"}
{"fullname":"Raymond Griffin","ticketNo":1762399766476,"tagNum":17657806243578,"routing":"MSQ/FRA/HKG"}
{"fullname":"Zina Christenson","ticketNo":1762390789239,"tagNum":"17657806228676","routing":"MIA/LAX/MEL"}
{"fullname":"Bonnie Williams","ticketNo":1762397286805,"tagNum":"17657806216554","routing":"SFO/ORD/FRA"}
{"fullname":"Joanne Diaz","ticketNo":1762383911861,"tagNum":"17657806292518","routing":"MIA/LAX/MEL"}
{"fullname":"Kendal Biddle","ticketNo":1762377974281,"tagNum":"17657806296887","routing":"JFK/IST/VIE"}
{"fullname":"Dierdre Amador","ticketNo":1762376407826,"tagNum":"17657806240229","routing":"JFK/MAD"}
{"fullname":"Birgit Naquin","ticketNo":1762392196147,"tagNum":"17657806240229","routing":"JFK/MAD"}
예제 3:SFO/SFO를 통한 운송에서 발생하는 모든 가방 태그 번호를 선택합니다.
SELECT bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"
설명:SFO에서 시작되거나 SFO를 통과하는 가방의 태그 번호를 인출합니다. 값 비교 연산자 =를 사용 중이지만 flightLegs는 배열이므로 비교 연산자 =의 왼쪽 피연산자는 항목이 두 개 이상인 시퀀스입니다. 이것이 값 비교 연산자 = 외에 시퀀스 연산자 any를 사용하는 이유입니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.
Error handling command SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc= "SFO":
Error: at (3, 6) The left operand of comparison operator = is a sequence with more than one items.
Comparison operators cannot operate on sequences of more than one items.
출력:
{"tagNum":"17657806240001","fltRouteSrc":"SFO"}
{"tagNum":"17657806216554","fltRouteSrc":"SFO"}
{"tagNum":["17657806240001","17657806340001"],"fltRouteSrc":["SFO","SFO"]}
{"tagNum":"1765780626568","fltRouteSrc":"SFO"}
{"tagNum":"17657806247861","fltRouteSrc":"SFO"}
예 4:JFK에서 시작되지 않은 모든 가방 태그 번호를 선택합니다.
SELECT bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[0].fltRouteSrc
FROM BaggageInfo bag
WHERE bag.bagInfo.flightLegs[0].fltRouteSrc!=ANY "JFK"
설명:여기서는 flightLegs 배열의 첫번째 레코드에 소스 위치의 세부정보가 있다고 가정합니다. 여기서 != 연산자를 사용하여 JFK에서 시작되지 않은 가방의 태그 번호를 인출합니다. 값 비교 연산자 !=를 사용 중이지만 flightLegs는 배열이므로 비교 연산자 !=의 왼쪽 피연산자는 항목이 두 개 이상인 시퀀스입니다. 이것이 값 비교 연산자 != 외에 시퀀스 연산자 any를 사용하는 이유입니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.
Error handling command SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[0].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo.flightLegs[0].fltRouteSrc!="JFK":
Failed to display result set: Error: at (2, 0) The left operand of comparison operator != is a sequence with
more than one items. Comparison operators cannot operate on sequences of more than one items.
출력:
{"tagNum":"17657806240001","fltRouteSrc":["SFO","IST","ATH"]}
{"tagNum":"17657806224224","fltRouteSrc":["GRU","ORD"]}
{"tagNum":"17657806243578","fltRouteSrc":["MSQ","FRA"]}
{"tagNum":"1765780623244","fltRouteSrc":["MXP","CDG","SLC"]}
{"tagNum":"17657806228676","fltRouteSrc":["MIA","LAX"]}
{"tagNum":"17657806234185","fltRouteSrc":["MEL","LAX"]}
{"tagNum":"17657806255507","fltRouteSrc":["MXP","CDG","SLC"]}
{"tagNum":"17657806292229","fltRouteSrc":["LAX","TPE"]}
{"tagNum":"17657806255823","fltRouteSrc":["MSQ","FRA"]}
{"tagNum":"17657806247861","fltRouteSrc":["SFO","IST","ATH"]}
{"tagNum":"17657806299833","fltRouteSrc":["YYZ","HKG"]}
{"tagNum":"17657806288937","fltRouteSrc":["MIA","LAX"]}
{"tagNum":"17657806216554","fltRouteSrc":["SFO","ORD"]}
{"tagNum":["17657806240001","17657806340001"],"fltRouteSrc":["SFO","IST","ATH","SFO","IST","ATH"]}
{"tagNum":"1765780626568","fltRouteSrc":["SFO","IST","ATH"]}
{"tagNum":"17657806255240","fltRouteSrc":["MIA","LAX"]}
{"tagNum":"17657806232501","fltRouteSrc":["BZN","SEA","CDG"]}
{"tagNum":"17657806292518","fltRouteSrc":["MIA","LAX"]}
IN 연산자
IN 연산자는 기본적으로 여러 OR-ed 등호 조건에 대한 간단한 대안입니다. 이 연산자를 사용하여 WHERE 절에 여러 값을 지정할 수 있습니다.
예: 고객 "Lucinda Beckman", "Adam Phillips","Zina Christenson","Fallon Clements"에 대한 태그 번호를 인출합니다.
SELECT bagdet.fullName, bagdet.bagInfo[].tagNum
FROM BaggageInfo bagdet
WHERE bagdet.fullName IN
("Lucinda Beckman", "Adam Phillips","Zina Christenson","Fallon Clements")
설명: 승객 목록의 태그 번호를 인출합니다. 인출할 승객 목록은 IN 절 내에서 제공될 수 있습니다.
출력:
{"fullName":"Lucinda Beckman","tagNum":"17657806240001"}
{"fullName":"Zina Christenson","tagNum":"17657806228676"}
{"fullName":"Adam Phillips","tagNum":"17657806255240"}
{"fullName":"Fallon Clements","tagNum":"17657806255507"}
정규 표현식 조건
정규식은 정규식 엔진이 입력 문자열과 일치시키려고 시도하는 패턴입니다. regex_like 함수는 정규식 일치를 수행합니다. regex_like 함수는 표준 SQL의 LIKE 연산자와 유사한 기능을 제공합니다. 즉, 입력 문자열이 지정된 패턴과 일치하는지 확인하는 데 사용할 수 있습니다. 입력 문자열과 패턴은 각각 첫번째와 두번째 인수로 계산됩니다. 세번째, 선택적 인수는 일치가 수행되는 방식에 영향을 주는 플래그 세트를 지정합니다.
패턴 문자열은 입력 텍스트가 일치하는 정규 표현식입니다. 마침표(.)는 줄바꿈을 제외한 모든 문자와 일치하는 메타 문자입니다. 그리디 한정자()는 선행 요소의 0번 이상 발생을 나타내는 메타 문자입니다. 예를 들어, 정규 표현식 "D."는 'D' 문자로 시작하고 그 뒤에 0개 이상의 문자가 오는 모든 문자열과 일치합니다.
예 1:이름이 'Z'로 시작하는 승객의 수하물 정보를 가져옵니다.
SELECT bag.fullname,bag.bagInfo[].tagNum
FROM BaggageInfo bag
WHERE regex_like(fullName, "Z.*")
설명:전체 이름이 Z로 시작하는 승객의 전체 이름 및 태그 번호를 인출합니다. 정규 표현식을 사용하여 전체 이름의 첫번째 문자가 "Z"여야 하고 나머지는 다른 모든 것이 될 수 있도록 지정합니다.
출력:
{"fullname":"Zina Christenson","tagNum":"17657806228676"}
{"fullname":"Zulema Martindale","tagNum":"17657806288937"}
예제 2:항공 항공편 출발지가 "M"인 승객의 수하물 정보를 가져옵니다.
옵션 1:
SELECT bag.fullname,bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[0].fltRouteSrc
FROM BaggageInfo bag
WHERE regex_like(bag.bagInfo.flightLegs[0].fltRouteSrc, ".*M.*")
설명:여기서는 flightLegs 배열의 첫번째 레코드에 소스 위치의 세부정보가 있다고 가정합니다. 비행 소스가 "M"인 승객의 전체 이름과 태그 번호를 인출합니다. 정규 표현식을 사용하여 소스 필드의 문자 중 하나가 "M"이어야 하고 나머지는 다른 문자일 수 있도록 지정합니다.
다른 접근 방식을 사용하여 위의 문제를 해결하기 위한 query를 작성할 수도 있습니다.
옵션 2:flightLegs 배열의 인덱스를 하드 코딩하는 대신 regex_like 함수를 사용하여 올바른 인덱스를 결정합니다.
SELECT bag.fullname,bag.bagInfo[].tagNum,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE EXISTS (bag.bagInfo.flightLegs[regex_like($element.fltRouteSrc, ".*M.*")])
옵션 3: "경로 지정" 필드의 하위 문자열을 사용하여 소스를 추출한 다음 regex_like 함수를 사용하여 소스에서 문자 M을 검색합니다.
SELECT bag.fullname,bag.bagInfo[].tagNum,
substring(bag.bagInfo[].routing,0,3)
FROM BaggageInfo bag WHERE
regex_like(substring(bag.bagInfo[].routing,0,3), ".*M.*")
출력:
{"fullname":"Raymond Griffin","tagNum":"17657806243578","fltRouteSrc":"MSQ"}
{"fullname":"Elane Lemons","tagNum":"1765780623244","fltRouteSrc":"MXP"}
{"fullname":"Zina Christenson","tagNum":"17657806228676","fltRouteSrc":"MIA"}
{"fullname":"Zulema Martindale","tagNum":"17657806288937","fltRouteSrc":"MIA"}
{"fullname":"Adam Phillips","tagNum":"17657806255240","fltRouteSrc":"MIA"}
{"fullname":"Joanne Diaz","tagNum":"17657806292518","fltRouteSrc":"MIA"}
{"fullname":"Teena Colley","tagNum":"17657806255823","fltRouteSrc":"MSQ"}
{"fullname":"Omar Harvey","tagNum":"17657806234185","fltRouteSrc":"MEL"}
{"fullname":"Fallon Clements","tagNum":"17657806255507","fltRouteSrc":"MXP"}
EXISTS 연산자
EXISTS 연산자는 입력 표현식에서 반환된 시퀀스가 비어 있는지 여부를 확인하고 각각 false 또는 true를 반환합니다. 특별한 경우는 입력 표현식이 NULL을 반환하는 경우입니다. 이 경우 EXISTS도 NULL을 반환합니다.
예 1:3개의 항공편 세그먼트가 있는 승객에 대한 승객 세부정보 및 수하물 정보를 선택합니다.
SELECT fullName, bag.bagInfo[].tagNum,
bag.bagInfo[].routing
FROM BaggageInfo bag
WHERE EXISTS bag.bagInfo[].flightLegs[2]
설명:3개의 항공편 세그먼트가 있는 승객의 세부정보를 인출합니다. EXISTS 연산자를 사용하여 비행 다리 배열의 세번째 요소가 있는지 평가하여 이를 확인합니다.
출력:
{"fullName":"Lorenzo Phil","tagNum":["17657806240001","17657806340001"],"routing":["SFO/IST/ATH/JTR","SFO/IST/ATH/JTR"]}
{"fullName":"Gerard Greene","tagNum":"1765780626568","routing":"SFO/IST/ATH/JTR"}
{"fullName":"Doris Martin","tagNum":"17657806232501","routing":"BZN/SEA/CDG/MXP"}
{"fullName":"Fallon Clements","tagNum":"17657806255507","routing":"MXP/CDG/SLC/BZN"}
{"fullName":"Michelle Payne","tagNum":"17657806247861","routing":"SFO/IST/ATH/JTR"}
{"fullName":"Lucinda Beckman","tagNum":"17657806240001","routing":"SFO/IST/ATH/JTR"}
{"fullName":"Elane Lemons","tagNum":"1765780623244","routing":"MXP/CDG/SLC/BZN"}
예제 2: 2019년 이후 배송된 모든 고객 수하물에 대한 전체 이름 및 태그 번호를 가져옵니다.
SELECT fullName, bag.ticketNo
FROM BaggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate >="2019-01-01T00:00:00"]
설명: 모든 가방에 대한 가방 도착 날짜 값은 2019년보다 커야 합니다. 여기서 "$element"는 컨텍스트 행(고객의 모든 백)에 바인딩됩니다. EXISTS 연산자는 입력 표현식에서 반환된 시퀀스가 비어 있는지 여부를 확인합니다. 비교 연산자 ">="에서 반환된 시퀀스는 2019년 이후에 도착한 모든 가방에 대해 비어 있지 않습니다.
출력:
{"fullName":"Lucinda Beckman","ticketNo":1762320569757}
{"fullName":"Adelaide Willard","ticketNo":1762392135540}
{"fullName":"Raymond Griffin","ticketNo":1762399766476}
{"fullName":"Elane Lemons","ticketNo":1762324912391}
{"fullName":"Zina Christenson","ticketNo":1762390789239}
{"fullName":"Zulema Martindale","ticketNo":1762340579411}
{"fullName":"Dierdre Amador","ticketNo":1762376407826}
{"fullName":"Henry Jenkins","ticketNo":176234463813}
{"fullName":"Rosalia Triplett","ticketNo":1762311547917}
{"fullName":"Lorenzo Phil","ticketNo":1762320369957}
{"fullName":"Gerard Greene","ticketNo":1762341772625}
{"fullName":"Adam Phillips","ticketNo":1762344493810}
{"fullName":"Doris Martin","ticketNo":1762355527825}
{"fullName":"Joanne Diaz","ticketNo":1762383911861}
{"fullName":"Omar Harvey","ticketNo":1762348904343}
{"fullName":"Fallon Clements","ticketNo":1762350390409}
{"fullName":"Lisbeth Wampler","ticketNo":1762355854464}
{"fullName":"Teena Colley","ticketNo":1762357254392}
{"fullName":"Michelle Payne","ticketNo":1762330498104}
{"fullName":"Mary Watson","ticketNo":1762340683564}
{"fullName":"Kendal Biddle","ticketNo":1762377974281}
유형임 연산자
is-of-type 연산자는 입력 시퀀스의 시퀀스 유형을 하나 이상의 대상 시퀀스 유형에 대해 검사합니다. 대상 유형의 N 수가 1보다 크면 표현식은 OR-ing N 유형 표현식과 동일하며 각각 대상 유형이 하나씩 있습니다.
예: STRING이 아닌 숫자만 포함하는 수하물 태그가 있는 승객의 이름을 인출합니다.
SELECT fullname,bag.bagInfo.tagNum
FROM BaggageInfo bag
WHERE bag.bagInfo.tagNum is of type (NUMBER)
설명:bagInfo 스키마의 tagNum은 STRING 데이터 유형입니다. 그러나 응용 프로그램은 실수로 NUMBER 값을 tagNum으로 사용할 수 있습니다. 이 질의는 tagNum 열에 숫자만 있는 승객을 캡처합니다.
출력:
{"fullname":"Raymond Griffin","tagNum":17657806243578}
위의 tagNum에 대해 bagInfo 스키마를 STRING으로 질의하면 행이 표시되지 않습니다.
SELECT * FROM BaggageInfo bag WHERE tagnum = "17657806232501"
0 row returned
수하물 태그에 STRING만 포함된 승객의 이름을 가져올 수도 있습니다.
SELECT fullname,bag.bagInfo.tagNum
FROM BaggageInfo bag
WHERE bag.bagInfo.tagNum is of type (STRING)
QueryRequest API를 사용하는 SQL Operator 예제
QueryRequest API를 사용하고 SQL 연산자를 사용하여 NoSQL 테이블에서 데이터를 필터링할 수 있습니다.
질의를 실행하려면 NoSQLHandle.query() API를 사용합니다.
SQLOperators.java 예제를 통해 여기에서 전체 코드를 다운로드할 수 있습니다.
//Fetch rows from the table
private static void fetchRows(NoSQLHandle handle,String sqlstmt) throws Exception {
try (
QueryRequest queryRequest = new QueryRequest().setStatement(sqlstmt);
QueryIterableResult results = handle.queryIterable(queryRequest)){
for (MapValue res : results) {
System.out.println("\t" + res);
}
}
}
String seq_comp_ope="SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any \"SFO\"";
System.out.println("Using Sequence Comparison operator ");
fetchRows(handle,seq_comp_ope);
String logical_ope="SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,bag.bagInfo[].flightLegs[].fltRouteSrc FROM BaggageInfo bag WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any \"SFO\"";
System.out.println("Using Logical operator ");
fetchRows(handle,logical_ope);
String value_comp_ope="SELECT fullname, bag.bagInfo[].routing FROM BaggageInfo bag WHERE gender=\"M\"";
System.out.println("Using Value Comparison operator ");
fetchRows(handle,value_comp_ope);
String in_ope="SELECT bagdet.fullName, bagdet.bagInfo[].tagNum FROM BaggageInfo bagdet WHERE bagdet.fullName IN (\"Lucinda Beckman\", \"Adam Phillips\",\"Dierdre Amador\",\"Fallon Clements\")";
System.out.println("Using IN operator ");
fetchRows(handle,in_ope);
String exists_ope="SELECT fullName, bag.ticketNo FROM BaggageInfo bag WHERE EXISTS bag.bagInfo[$element.bagArrivalDate >=\"2019-03-01T00:00:00\"]";
System.out.println("Using EXISTS operator ");
fetchRows(handle,exists_ope);
query를 실행하려면 borneo.NoSQLHandle.query() 메소드를 사용합니다.
SQLOperators.py 예제를 통해 여기에서 전체 코드를 다운로드해 보세요.
# Fetch data from the table
def fetch_data(handle,sqlstmt):
request = QueryRequest().set_statement(sqlstmt)
print('Query results for: ' + sqlstmt)
result = handle.query(request)
for r in result.get_results():
print('\t' + str(r))
seqcomp_stmt = '''SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"'''
print('Using Sequence Comparison operator:')
fetch_data(handle,seqcomp_stmt)
logope_stmt = '''SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"'''
print('Using Logical operator:')
fetch_data(handle,logope_stmt)
valcomp_stmt = '''SELECT fullname, bag.bagInfo[].routing
FROM BaggageInfo bag WHERE gender="M"'''
print('Using Value Comparison operator:')
fetch_data(handle,valcomp_stmt)
inope_stmt = '''SELECT bagdet.fullName, bagdet.bagInfo[].tagNum
FROM BaggageInfo bagdet WHERE bagdet.fullName IN
("Lucinda Beckman", "Adam Phillips","Dierdre Amador","Fallon Clements")'''
print('Using IN operator:')
fetch_data(handle,inope_stmt)
existsope_stmt = '''SELECT fullName, bag.ticketNo FROM BaggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate >="2019-03-01T00:00:00"]'''
print('Using EXISTS operator:')
fetch_data(handle,existsope_stmt)
질의를 실행하려면 Client.Query 함수를 사용합니다.
SQLOperators.go 예제를 통해 여기에서 전체 코드를 다운로드하십시오.
//fetch data from the table
func fetchData(client *nosqldb.Client, err error, tableName string, querystmt string)(){
prepReq := &nosqldb.PrepareRequest{
Statement: querystmt,
}
prepRes, err := client.Prepare(prepReq)
if err != nil {
fmt.Printf("Prepare failed: %v\n", err)
return
}
queryReq := &nosqldb.QueryRequest{
PreparedStatement: &prepRes.PreparedStatement, }
var results []*types.MapValue
for {
queryRes, err := client.Query(queryReq)
if err != nil {
fmt.Printf("Query failed: %v\n", err)
return
}
res, err := queryRes.GetResults()
if err != nil {
fmt.Printf("GetResults() failed: %v\n", err)
return
}
results = append(results, res...)
if queryReq.IsDone() {
break
}
}
for i, r := range results {
fmt.Printf("\t%d: %s\n", i+1, jsonutil.AsJSON(r.Map()))
}
}
seqcomp_stmt := `SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"`
fmt.Printf("Using Sequence Comparison operator:\n"
fetchData(client, err,tableName,seqcomp_stmt)
logope_stmt := `SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"`
fmt.Printf("Using Logical operator:\n")
fetchData(client, err,tableName,logope_stmt)
valcomp_stmt := `SELECT fullname, bag.bagInfo[].routing FROM BaggageInfo bag WHERE gender="M"`
fmt.Printf("Using Value Comparison operator:\n")
fetchData(client, err,tableName,valcomp_stmt)
inope_stmt := `SELECT bagdet.fullName, bagdet.bagInfo[].tagNum FROM BaggageInfo bagdet
WHERE bagdet.fullName IN ("Lucinda Beckman", "Adam Phillips","Dierdre Amador","Fallon Clements")`
fmt.Printf("Using IN operator:\n")
fetchData(client, err,tableName,inope_stmt)
existsope_stmt := `SELECT fullName, bag.ticketNo FROM BaggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate >="2019-03-01T00:00:00"]`
fmt.Printf("Using EXISTS operator:\n")
fetchData(client, err,tableName,existsope_stmt)
질의를 실행하려면 query 메소드를 사용합니다.
JavaScript: SQLOperators.js 예제의 전체 코드를 다운로드하십시오.
//fetches data from the table
async function fetchData(handle,querystmt) {
const opt = {};
try {
do {
const result = await handle.query(querystmt, opt);
for(let row of result.rows) {
console.log(' %O', row);
}
opt.continuationKey = result.continuationKey;
} while(opt.continuationKey);
} catch(error) {
console.error(' Error: ' + error.message);
}
}
TypeScript: SQLOperators.ts 예제를 통해 여기에서 전체 코드를 다운로드할 수 있습니다.
interface StreamInt {
acct_Id: Integer;
profile_name: String;
account_expiry: TIMESTAMP;
acct_data: JSON;
}
/* fetches data from the table */
async function fetchData(handle: NoSQLClient,querystmt: string) {
const opt = {};
try {
do {
const result = await handle.query<StreamInt>(querystmt, opt);
for(let row of result.rows) {
console.log(' %O', row);
}
opt.continuationKey = result.continuationKey;
} while(opt.continuationKey);
} catch(error) {
console.error(' Error: ' + error.message);
}
}
const seqcomp_stmt = `SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"`
console.log("Using Sequence Comparison operator");
await fetchData(handle,seqcomp_stmt);
const logope_stmt = `SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any "SFO"`
console.log("Using Logical operator");
await fetchData(handle,logope_stmt);
const valcomp_stmt = `SELECT fullname, bag.bagInfo[].routing FROM BaggageInfo bag WHERE gender="M"`
console.log("Using Value Comparison operator");
await fetchData(handle,valcomp_stmt);
const inope_stmt = `SELECT bagdet.fullName, bagdet.bagInfo[].tagNum
FROM BaggageInfo bagdet WHERE bagdet.fullName IN
("Lucinda Beckman", "Adam Phillips","Dierdre Amador","Fallon Clements")`
console.log("Using IN operator");
await fetchData(handle,inope_stmt);
const existsope_stmt = `SELECT fullName, bag.ticketNo FROM BaggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate >="2019-03-01T00:00:00"]`
console.log("Using EXISTS operator");
await fetchData(handle,existsope_stmt);
질의를 실행하기 위해 QueryAsync 메소드를 호출하거나 GetQueryAsyncEnumerable 메소드를 호출하여 결과 비동기 열거형을 반복할 수 있습니다.
SQLOperators.cs 예제를 통해 여기에서 전체 코드를 다운로드할 수 있습니다.
private static async Task fetchData(NoSQLClient client,String querystmt){
var queryEnumerable = client.GetQueryAsyncEnumerable(querystmt);
await DoQuery(queryEnumerable);
}
private static async Task DoQuery(IAsyncEnumerable<QueryResult<RecordValue>> queryEnumerable){
Console.WriteLine(" Query results:");
await foreach (var result in queryEnumerable) {
foreach (var row in result.Rows)
{
Console.WriteLine();
Console.WriteLine(row.ToJsonString());
}
}
}
private const string seqcomp_stmt =@"SELECT bag.bagInfo[].tagNum,bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag WHERE bag.bagInfo[].flightLegs[].fltRouteSrc=any ""SFO""";
Console.WriteLine("\nUsing Sequence Comparison operator!");
await fetchData(client,seqcomp_stmt);
private const string logope_stmt =@"SELECT fullName, bag.bagInfo[].tagNum, bag.bagInfo[].routing,
bag.bagInfo[].flightLegs[].fltRouteSrc
FROM BaggageInfo bag
WHERE NOT bag.bagInfo[].flightLegs[].fltRouteSrc=any ""SFO""";
Console.WriteLine("\nUsing Logical operator!");
await fetchData(client,logope_stmt);
private const string valcomp_stmt =@"SELECT fullname, bag.bagInfo[].routing FROM BaggageInfo bag WHERE gender=""M""" ;
Console.WriteLine("\nUsing Value Comparison operator!");
await fetchData(client,valcomp_stmt);
private const string inope_stmt =@"SELECT bagdet.fullName, bagdet.bagInfo[].tagNum
FROM BaggageInfo bagdet WHERE bagdet.fullName IN
(""Lucinda Beckman"", ""Adam Phillips"",""Dierdre Amador"",""Fallon Clements"")";
Console.WriteLine("\nUsing IN operator!");
await fetchData(client,inope_stmt);
private const string existsope_stmt =@"SELECT fullName, bag.ticketNo FROM BaggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate >=""2019-03-01T00:00:00""]";
Console.WriteLine("\nUsing EXISTS operator!");
await fetchData(client,existsope_stmt);