SELECT NUMERIC '1.23' AS pmt
IS NOT
사용 가능WHERE
절과 SELECT
조건식에서 유용하게 사용됨 IF(평가할 조건(mark IS NULL), 참일 때 반환, 거짓일 때 반환)
만약 SELECT에서 해당 조건을 호출한다면 모든 행에 적용 > 할인가가 적용되는 일부 상품이 존재할 때 사용 가능 ROUND
SUBSTR(str, pos, len)
: pos 위치에서 len의 길이 str 반환IEEE_DEVIDE(x, y)
: 분모가 0일 가능성이 있을 때 사용. 0으로 나누려 하면 NAN(Not a Number)이 반환됨.SAFE
: 스칼라 함수 앞에 SAFE 접두사를 붙이면 오류를 발생시키지 않고 Null 반환SELECT SAFE.LOG(10, -3), LOG(10,3)
# Log 음수는 본래 오류가 떠야 하나 Null이 반환됨
GROUP BY
와 함께 사용
Table-Valued
From절에서 사용할 수 있는 결과 집합을 반환하는 함수
Array에서 UNNEST를 호출한 다음 선택 가능함
USER-Defined
CREATE A FUNCTION
비교연산
- < , <= , > , >= , != (<>)
- Null < NaN < 유효숫자
- Null과 비교시 언제나 Null 반환
- NaN과 비교시 언제나 False 반환
값에 NULL이 있는지 확인하려면 IS 연산자 사용
WHERE <column>
vsWHERE <column> IS NOT false
WHERE IS NOT false
는 TRUE인 애와 NULL인 애를 반환하지만WHERE <column>
은 (WHERE <column> IS TRUE
와 동일) TRUE인 애만 반환함
WHERE <column>
BigQuery에서 &, |은 비트 연산에만 사용 가능
IF
조건식COALESCE
-- X Table이 존재하고
SELECT *, ROUND(COASLESCE(
a * (1+b) * (1+c),
a * 1.2 * (1+c),
a * (1+b) * 1.2,
NULL
), 2) AS Price
FROM X
IFNULL
IFNULL(a, b)
: a가 NULL이면 b를 반환 IF(a IS NULL, b, a)
와 동일함 SELECT *, ROUND(costPrice*
(1+ IFNULL(b, 0.5)) *
(1+ IFNULL(c, 0.1)),
2) AS Price
FROM X
CAST()
& SAFE_CAST()
CAST()
함수를 이용함 CAST()
대신 SAFE_CAST()
를 사용 -- X Table이 존재하고
SELECT SUM(SAFE_CAST(a_column AS INT64)) FROM X
- 결과 값으로 a_column에 SUM이 불가능한 문자열이 존재하는 경우 그를 제외한 INT만 SUM한 값이 나옴
- 만약 모든 행의 데이터가 숫자를 감싸고 있는 문자열이라면 (ex. '24') 그냥
CAST()
로도 문제 없이 계산됨
FORMAT()
사용
날짜나 타임스탬프의 경우 FORMAT_DATE
, FORMAT_TIMESTAMP
사용
FORMAT('%0.3d', 42) -- 042
FORMAT('%5.3f', 12.4) --12.400
FORMAT('@@%s33', "a") -- @@a33
FORMAT('%s-%02d', "a", 4) -- a-04
BigQuery에서는 Boolean을 SUM, AVG로 계산 불가하기 때문에 방법이 필요함
1. 타입 변환
-- X Table이 존재하고
SELECT SUM(CAST(a_column AS INT64)) AS num_column FROM X
IF
사용 -- X Table이 존재하고
SELECT SUM(IF(a_column, 1, 0)) AS num_column FROM X
COUNTIF
사용 [BEST Option]-- X Table이 존재하고
SELECT COUNTIF(a_column) AS num_column FROM X
LENGTH(a_col)
LOWER(a_col)
`ENDS_WITH(기준문자열, 찾고자하는 문자열)
`STARTS_WITH(기준문자열, 찾고자하는 문자열)
STRPOS(a_col, '찾고자 하는 문자열')
: 찾고자 하는 문자열 위치 값 나옴. 없으면 0값 나옴
CONCAT()
: 입력값 연결
SUBSTR(str, pos, len)
: 부분 문자열을 추출 > pos의 위치에서 len만큼의 문자열을 읽음
SELECT(CONCAT(SUBSTR(email, 1, STRPOS(email, '@') -1, 'from', city) AS name_city
CHAR_LENGTH()
로 길이 확인CAST(a_column AS BYTES)
바이트 배열 > BYTE_LENGTH()
로 길이 확인TO_CODE_POINTS()
유니코드 코드 포인트 배열(INT64) > ARRAY_LENGTH()
로 길이 확인LPAD(기준문자열, 총 문자열 length, 왼쪽에 추가하고자 하는 문자)
RPAD(기준문자열, 총 문자열 length, 오른쪽에 추가하고자 하는 문자)
LTRIM(기준문자열)
: 왼쪽의 공백 제거 RTRIM(기준문자열)
: 오른쪽 공백 제거TRIM(기준문자열, 일부 문자열만 제거하고싶을 시 해당 문자열 기재)
: 양쪽 공백 제거 REVERSE(기준문자열)
: 문자열 앞 뒤 바꿈 TRIM('**street', '*') -- street
REGEXP_CONTAINS(column, r'')
REGEXP_EXTRACT
REGEXP_EXTRACT_ALL
REGEXP_REPLACE
TIMESTAMP_DIFF(기준1, 기준2, Diff 기준)
PARSE_TIMESTAMP()
사용 FORMAT_TIMESTAMP
PARSE_TIMESTAMP
1)%Y%m%d-%H%M%S 2)
%c3)
%x %X`
TODO 정확히 확인하기
EXTRACT(DAYOFWEEK FROM a_column)
EXTRACT(YEAR FROM a_column)
EXTRACT(WEEK FROM a_column)
: 한 주의 시작은 일요일. 이스라엘과 같이 토요일이 한 주의 시작인 국가는 EXTRACT(WEEK('SATURDAY') FROM a_column)
으로 지정UNIX_MILLIS(TIMESTAMP, '타임스탬프 정보')
TIMESTAMP_MILLIS(유닉스 시간 정보)
TIMESTAMP_ADD(a_col, INTERVAL 1 HOUR)
TIMESTAMP_SUB(a_col, INTERVAL 10 MINUTE)
TIMESTAMP_DIFF(A타임스탬프, B타임스탬프, SECOND)
DATE
, TIME
, DATETIME
사용 DATETIME
타입에는 TIMESTAMP
함수 사용 가능하며, 서로 호환/변환 가능함 DATETIME
타입에는 날짜와 시간을 구분하는 T가 사용되며, TIMESTAMP
는 공백을 사용함 DATETIME
타입에는 시간대가 내포되어있고, TIMESTAMP
는 시간대를 포함하고 있음(UTC 포함)TIMESTAMP
와 DATE
가 많이 사용되지만, (다른 SQL에서)TIMESTAMP
는 유닉스 시간의 한도인 1970년도 to 2038년도까지만 사용 가능하기 때문에 60대 이상의 나이 계산이 불가함