반응형
SQL 에서 Where 1=1은 왜 쓰는걸까
- 요약 : 가독성을 위해서 / 주석처리 하려고
0. 무슨뜻 ?
- 1=1 말그대로 참
- 딱히 의미를 가지는건 아님
1. 어디서 사용?
- 쿼리를 다시 한번 훑을때 (디버깅) 주석처리하기 편하다
WHERE push_type_cd = '1'
AND reg_dttm >= '2022-03-29'
대신
WHERE 1 = 1
AND push_type_cd = '1'
AND reg_dttm >= '2022-03-29'
을 쓰면
WHERE 1 = 1
-- AND push_type_cd = '1' => 여기만 주석처리 쉽게 가능 !
AND reg_dttm >= '2022-03-29'
이렇게 쉽게 주석처리 가능하다 .
하나씩 주석처리하면서 쿼리 확인가능 !
LIMIT 걸어서 보는것도 잊지말자
2. 그럼 무조건 써야하나 ?
https://dejavuhyo.github.io/posts/why-avoid-using-the-dynamic-query-where-1=1/
위 링크를 보면
지양 해야 한다고 써져있다.
- select 할때는 큰문제가 없지만
- update하거나 delete 할때는 조금 문제가 된다.
- Null 값 때문에
3. What is the purpose of using WHERE 1=1 in SQL statements?
https://stackoverflow.com/questions/1264681/what-is-the-purpose-of-using-where-1-1-in-sql-statements
- 더 자세하게
https://www.navicat.com/en/company/aboutus/blog/1812-the-purpose-of-where-1-1-in-sql-statements
- 쿼리 실행 시간비교 -> 별 효과없음 큰차이 안남
[MySQL] mysql 키워드에서 문자 개수 찾기
CHAR_LENGTH(cm.card_nm) -CHAR_LENGTH(REPLACE('키워드나 컬럼명', ' ', ''))
CHAR_LENGTH
= 문자열의 길이를 return 한다.- 공백을 찾고싶어서 ' ' 를 사용다른 문자를 찾고싶으면 두번째 ''안에 다른 문자를 넣으면 됨
- ''으로 대체 하는 replace 사용
SELECT
CASE
WHEN Char_length(cm.card_nm) -Char_length(Replace(cm.card_nm, ' ', '')) = 1 THEN '1'
ELSE
end
from 테이블
이런식으로 나누어 라벨링 가능
비슷하게 INSTR 이라는 함수도 있다.
- INSTR() 함수는 다른 문자열에서 문자열이 처음 나타나는 위치를 반환한다
- "W3Schools.com"에서 3을 찾고 싶으면 아래와 같이 사용한다 .
SELECT Instr("w3schools.com", "3") AS MatchPosition;
- 아래를 참고 했다.
https://www.w3schools.com/sql/func_mysql_instr.asp
SELECT Instr(
'w3schools.com'
, '3') as INSTR1,
Instr(
'w3schools.com'
, '3', 4) as INSTR2,
Instr(
'w3schools.com'
, '3', 4, 2) as INSTR3
FROM table_name;
🤝
- INSTR1은 위에 있는 설명과 같다.
- INSTR2는 4번째 위치부터 3을 찾고
- INSTR3은 시작위치를 4 발생횟수를 2로 정해서 3번째 3을 찾는다.
- -1을 넣으면 뒤에서 부터 찾는다.
[Oracle]기반의 설명인데, 오라클과 Mysql은 비슷하니 뭐 ,,, 비슷하지 않을까 생각한다 !
🙀 만약 어떠한 문자를 찾은 위치부터 다시 찾는다면 ? Instr() 함수 안에 또 instr()함수를 한번 더 사용할 수있을까?
- 글들을 뒤져보니 2014년에는 가능했다.
- 근데 지금은 해보니까 안된다. 아마 어느 패치가 된듯 하다
- 그럴때는 substring으로 잘라내고 instr()함수를 사용하자 !
반응형
댓글