SharedIT | 묻고 답하기(AMP)

MSSQL 조건절 질문입니다.

안녕하세요.

기존 프로그램의 쿼리를 수정하려 살펴보다 조건절에 아래와 같이 생소한 문법이 보여서 문의 드립니다.

where 1=1 

[ AND a.outdt like @dt + '%' ]

[ AND a.outty  = @ty ]


이런식으로 조건절에 대괄호가 씌워져 있는데 어떠한 용도인가요~?


파라메터 값 유무에 따라 조건을 적용하는 그런건가요~~??  궁금합니다~!

Tags : 태그가 없습니다.

3개의 답변이 있습니다.

빨간신발
  0 추천 | 3년 이상 전

[ ] 의 용도는 sql 자체에서는 잘 모르겠습니다. 사용한 경험이 없네요...

[ ] 는 sql 자체에서 필요한 게 아니고 다른 sql을 사용하는 다른 프로그램에 해당 조건을 넣어다 뺐다 제어하려고 넣은 거 같습니다.

그래서 필요없는 "where 1=1" 문장이 들어가 있는 것으로 보여지네요..

정상적인 문법은

where a.outdt like @dt + '%' 

   AND a.outty  = @ty 


이렇게 하는 게 맞는 것으로 보이는데


outdt에 대한 조건과 outty에 대한 조건을 둘다 포함하는 경우도 있고 하나만 포함하거나 둘다 빠지는 경우도 있을 수 있어서...


둘 다 빠지는 경우를 대비해서 "1=1" 구문을 넣은 것으로 보이네요...


wansoo
  0 추천 | 3년 이상 전

개발 언어가 무엇인지는 잘 모르겠고,

[ ] 가 프로그램 안에서 어떤 의미로 사용되고 있는지 잘 모르겠는데요.

아마도 프로그램이 SQL에 쿼리를 보내기 전에 다른 가공 처리를 해서 완성된 쿼리를 만드는게 아닌가 싶어 보이기도 한데요...

일반적으로 where 절에 1=1 을 사용하고 and로 묶어 버린다면 논리 결과 true와 and가 만나게 되어 where 절 문법에서 논리적으로 아무런 효과도 없는 결과를 주게 되겠는데요.

오히려 미세하지만 아무 의미 없는 결과를 위해서 처리를 해야 해서 연산 성능을 낮출수 있고, 보안적인 관점에서도 SQL Injection과 같은 취약점을 남길 수 있는 문제를 유발 할 수 있게 만드는 부작용이 있겠는데요.

다만...

프로그램 안에서 동적 쿼리를 만들어야 할때 where 와 and 키워드를 넣고 빼고 하는 판단을 복잡하게 처리할 필요없어서 편리하게 사용할 수 있게 해 주고요.

예를 들어...

whrere 1=1

 and  a.outdt like @dt + '%' 

 and a.outty = @ty

whrere  a.outdt like @dt + '%' 

 and a.outty = @ty

whrere  a.outty = @ty

 and a.outdt like @dt + '%' 

와 같이 사용할 경우에

a.outdt like @dt + '%'  에 해당하는 조건을 넣지 않는다거나 a.outdt like @dt + '%' 에 대한 조건을 넣지 않을 경우에 단순히 where 다음에 조건을 없애 버린다면 쿼리문에 오류가 발생되어 다음에 오는 and 까지 함께 제거해 줘야 해서 쿼리문 사전 처리 ( Preprocessing ) 하는데 문제가 생기게 되겠고요~


길게 적었는데...

간단하게 말해~

"동적 쿼리를 작성하기 위한 목적" 이라고 보시면 될 것 같네요.

양성환
  0 추천 | 3년 이상 전

프로그램내에서는 append 로 처리하려고 한것 같은데

사실 습관적인 1=1 이 더 문제가 될 소지가 큽니다. 

이게 값 없이 null 이 갈 경우 전체에 영향을 주거든요..

그래서 최악의 delete ...where 1=1 에 and~ 변수가 들어가게 될 경우에 null 이 들어가면

에러가 리턴되야 하는데 전부 다 날리는...최악의 경우도 발생할 수 있죠