programing

SQL 절에서 WHERE 1=1 AND를 사용하는 이유는 무엇입니까?

lastcode 2023. 5. 7. 11:29
반응형

SQL 절에서 WHERE 1=1 AND를 사용하는 이유는 무엇입니까?

왜 누군가가 사용하겠습니까?WHERE 1=1 AND <conditions>SQL 절(연결된 문자열을 통해 SQL을 얻거나 보기 정의를 사용합니다.

이것이 SQL Injection으로부터 보호하기 위해 사용될 것이라고 어디선가 본 적이 있지만, 매우 이상한 것 같습니다.

WHERE 1 = 1 AND injected OR 1=1와 동일한 결과를 얻을 수 있습니다.injected OR 1=1.

나중에 편집:보기 정의의 사용 방법은 무엇입니까?


답변 감사합니다.

그럼에도 불구하고, 나는 왜 누군가가 뷰를 정의하거나 저장 프로시저 내에서 이 구조를 사용하는지 이해할 수 없습니다.

예를 들어 다음과 같습니다.

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

조건 목록을 컴파일할 때 알 수 없고 대신 런타임에 작성된 경우 하나 이상의 조건이 있는지 여부에 대해 걱정할 필요가 없습니다.다음과 같이 모두 생성할 수 있습니다.

and <condition>

그리고 그것들을 모두 연결합니다.1=1처에음, 이셜니.and연관된 것이 있습니다.

저는 이것이 어떤 종류의 주사 보호에 사용되는 것을 본 적이 없는데, 당신이 그것이 큰 도움이 될 것 같지 않다고 말씀하셨기 때문입니다.나는 그것이 구현 편의성으로 사용되는 것을 보았습니다.SQL 쿼리 엔진이 다음을 무시하게 됩니다.1=1성능에 영향을 미치지 않아야 합니다.

Greg의 답변에 예제 코드를 추가하는 중입니다.

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if

조건의 수가 변할 수 있을 때 사용하는 것을 본 적이 있습니다.

AND 문자열을 사용하여 조건을 연결할 수 있습니다.그런 다음 전달하는 조건 수를 세는 대신 재고 SQL 문 끝에 "WHERE 1=1"을 배치하고 연결된 조건을 추가합니다.

기본적으로 조건에 대한 테스트를 수행한 다음 조건 앞에 "WHERE" 문자열을 추가해야 하는 시간을 절약합니다.

WHERE 절이 이미 정의되어 있다는 것을 항상 알고 첫 번째 절인지 확인할 필요 없이 조건을 계속 추가할 수 있는 게으른 방법인 것 같습니다.

간접 관련: 1=2를 사용하는 경우:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

이전 테이블과 동일한 스키마를 사용하여 새 테이블을 만듭니다.(비교를 위해 일부 데이터를 로드하려는 경우 매우 유용합니다.)

데이터베이스의 내용을 테스트하거나 이중으로 확인할 때 이 패턴이 유용하다는 것을 알게 되었습니다. 따라서 다른 조건에 대해 매우 빠르게 설명할 수 있습니다.

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
AND Table.Field=Value
AND Table.IsValid=true

다음으로 변환:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true

1 = 1 식은 생성된 SQL 코드에서 일반적으로 사용됩니다.이 식을 사용하면 SQL 생성 코드를 단순화하여 조건문 수를 줄일 수 있습니다.

사실, 저는 BIRT 보고서에서 이런 종류의 것을 본 적이 있습니다.BIRT 런타임에 전달된 쿼리의 형식은 다음과 같습니다.

select a,b,c from t where a = ?

그리고 '?'는 실행 시 드롭다운 상자에서 선택한 실제 매개 변수 값으로 대체됩니다.드롭다운에서 선택할 수 있는 방법은 다음과 같습니다.

select distinct a from t
union all
select '*' from sysibm.sysdummy1

값에"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " " " " " " " " " " " " 을 얻을 수 .*가 "사용자가를 한 경우*의 모든 값을 선택해야 함을 의미하는 드롭다운 상자에서 쿼리를 실행하기 전에 Javascript로 수정해야 합니다.

"?"는 위치 매개 변수이며 다른 작업을 수행하기 위해 해당 위치에 남아 있어야 하므로 Javascript는 쿼리를 다음과 같이 수정합니다.

select a,b,c from t where ((a = ?) or (1==1))

그러면 기본적으로 위치 매개 변수를 그대로 유지하면서 where 절의 효과가 제거됩니다.

SQL 쿼리를 동적으로 생성하면서 게으른 코더들이 사용하는 AND 사례도 보았습니다.

다으로시쿼는리동를적만로로 한다고 .select * from t 확인 "다음"을 참조:

  • 이름은 밥이고,
  • 급여는 2만 달러 이상입니다.

어떤 사람들은 처음에는 WHERE로, 이후에는 다음과 같이 추가합니다.

select * from t where name = 'Bob' and salary > 20000

게으른 프로그래머(그리고 그것이 반드시 나쁜 특성은 아니다)는 추가된 조건을 구별하지 않고, 그들은 시작할 것입니다.select * from t where 1=1그리고 그 뒤에 AND 조항을 추가하면 됩니다.

select * from t where 1=1 and name = 'Bob' and salary > 20000

여기서 1=0은 테이블이 존재하는지 확인하기 위해 수행됩니다.1=1이 왜 사용되는지 모르겠습니다.

1=1이 생성된 SQL에 유용할 것이라는 것을 알 수 있지만, PHP에서 사용하는 기술은 절 배열을 만들고 나서 하는 것입니다.

implode (" AND ", $clauses);

따라서 선행 또는 후행의 문제를 방지할 수 있습니다.분명히 이것은 적어도 하나의 조항이 있을 것이라는 것을 알고 있을 때만 유용합니다!

밀접한 이 있는 예입니다: 하기: SQLMERGE예를 들어 가입할 공통 속성이 없는 소스 테이블의 모든 값을 사용하여 대상 테이블을 업데이트하는 문입니다.

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;

만약 당신이 여기에 찾아왔다면,WHERE 1을 주의하여 보다WHERE 1그리고.WHERE 1=1동일합니다. WHERE 1에서는 일부데이시스이이거를때부거않사문기습의다용니지에되하템스이베터ering▁is▁some▁it않▁consid▁usedWHERE 1실제로 부울적이지 않습니다.

1과 WHERE 1=1을 요?<proper conditions>

저는 홈스펀 프레임워크가 게으른 구문 분석 관행을 두 가지 모두에 적용할 수 있도록 하기 때문에 이러한(흐림) 작업을 수행하는 것을 보았습니다.WHERE그리고.ANDSQL 키워드.

예를 들어(여기서는 C#을 예로 사용합니다), SQL 쿼리에서 다음 술어의 조건부 구문 분석을 고려합니다.string builder:

var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
    sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
    sqlQuery = sqlQuery + " AND Baz < 12";
}

의 "혜택"WHERE 1 = 1는 특별한 코드가 필요하지 않음을 의미합니다.

  • AND의 경우 - 0이든, 하나 또는 둘 다의 술어(Bars 및 Baz's)가 적용되어야 하며, 이는 첫 번째 술어의 여부를 결정합니다.AND필수 항목입니다.왜냐하면 우리는 이미 적어도 하나의 술어를 가지고 있기 때문입니다.1 = 1라는 뜻입니다.AND항상 좋습니다.
  • 술어가 전혀 없는 경우 - 술어가 ZERO인 경우,WHERE삭제해야 합니다.하지만 다시 말하지만, 우리는 게으를 수 있습니다. 왜냐하면 우리는 다시 적어도 하나의 술어를 보장받기 때문입니다.

이는 명백히 잘못된 생각이며 이러한 방식으로 선택적 및 조건부 술어를 구문 분석하기 위해 확립된 데이터 액세스 프레임워크 또는 ORM을 사용하는 것이 좋습니다.

모든 답을 검토한 후에 저는 다음과 같은 실험을 수행하기로 결정했습니다.

SELECT
*
FROM MyTable

WHERE 1=1

그리고 다른 번호로 확인했습니다.

WHERE 2=2
WHERE 10=10
WHERE 99=99

ect가 모든 확인을 해보니 쿼리 실행 마을이 동일합니다.where 조항이 없어도.나는 구문론의 팬이 아닙니다.

이 기능은 일부 필터 옵션을 추가해야 하는 절에서 동적 쿼리를 사용해야 하는 경우에 유용합니다.예를 들어 상태가 비활성인 경우 0, 활성인 경우 1을 포함합니다.옵션을 기준으로 사용할 수 있는 옵션은 두 가지(0과 1)뿐이지만 All records(모든 레코드)를 표시하려면 1=1을 닫는 곳에 포함하는 것이 좋습니다.아래 샘플을 참조하십시오.

Declare @SearchValue    varchar(8) 
Declare @SQLQuery varchar(max) = '
Select [FirstName]
    ,[LastName]
    ,[MiddleName]
    ,[BirthDate]
,Case
    when [Status] = 0 then ''Inactive''
    when [Status] = 1 then ''Active''
end as [Status]'

Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
    Set @SearchOption = ' Where a.[Status] = 1'
End

If (@SearchValue = 'Inactive')
Begin
    Set @SearchOption = ' Where a.[Status] = 0'
End

If (@SearchValue = 'All')
Begin
    Set @SearchOption = ' Where 1=1'
End

Set @SQLQuery = @SQLQuery + @SearchOption

Exec(@SQLQuery);

생산 코드에서 이것을 보고 선배들에게 도움을 요청했습니다.

그들의 대답:

-우리는 1=1을 사용하기 때문에 새로운 조건을 추가해야 할 때 그냥 입력할 수 있습니다.

and <condition>

그리고 그것을 계속하세요.

일반적으로 사용자가 선택할 수 있는 드롭다운 값이 많은 보고서에 대한 동적 SQL을 작성할 때 이 작업을 수행합니다.사용자가 각 드롭다운에서 값을 선택할 수도 있고 선택하지 않을 수도 있기 때문에 어떤 조건이 첫 번째 where 절이었는지 파악하는 데 어려움을 겪게 됩니다.그래서 우리는 질문을 다음과 같이 채웁니다.where 1=1마지막에 그리고 그 뒤에 all where 절을 추가합니다.

비슷한 것

select column1, column2 from my table where 1=1 {name} {age};

그런 다음 where 절을 이렇게 구축하여 매개 변수 값으로 전달할 것입니다.

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

절알 수 에 where 절을 할 때 를 찾는 데 많은 도움이 .'AND' or 'WHERE'.

또한 "where 1=1"을 모든 쿼리의 표준으로 설정하면 명령/파일 배치가 있을 때 유용한 SQL을 1 = 0으로 대체하여 검증하기가 매우 쉽습니다.

또한 쿼리의 시작/참여 섹션 끝을 쉽게 찾을 수 있습니다.적절하게 들여쓴 경우 하위 쿼리를 사용한 쿼리도 마찬가지입니다.

저는 ADO와 고전적인 asp를 처음 접했는데, 제가 얻은 답은 성능이었습니다.똑바로 하면

Select * from tablename

이를 SQL 명령/텍스트로 전달하면 성능이 눈에 띄게 향상됩니다.

Where 1=1

게다가, 그것은 눈에 보이는 차이였습니다.첫 번째 조건이 충족되자마자 테이블 헤더가 반환되는 것과 관련이 있거나 다른 미친 것과 관련이 있습니다. 어쨌든 속도를 높였습니다.

다과같 사용술어와 같은 것.1=1액세스 계획에서 인덱스 검색을 사용하거나 사용하지 않도록 강제하는 데 사용되는 일반적인 힌트입니다.이것이 사용되는 이유는 where 절에 많은 술어가 있는 다중 중첩 조인 쿼리를 사용하는 경우입니다. 때때로 모든 인덱스를 사용하더라도 액세스 계획이 각 테이블(전체 테이블 검색)을 읽게 됩니다.이는 DBA가 더 효율적인 경로를 사용하도록 abms를 속이기 위해 사용하는 많은 힌트 중 하나에 불과합니다.하나만 집어넣지 마십시오. 항상 작동하는 것은 아니기 때문에 쿼리를 분석할 DBA가 필요합니다.

여기 사용 사례가 있습니다...하지만 저는 왜 1 = 1을 사용해야 하는지에 대한 기술적인 문제는 크게 신경 쓰지 않습니다. 저는 SQL Server에서 일부 데이터를 검색하기 위해 pyodbc를 사용하여 함수를 작성하고 있습니다.수술 후에 필러를 강제로 주입하는 방법을 찾고 있었습니다.where내 코드에 있는 키워드.이것은 정말 훌륭한 제안이었습니다.

if _where == '': _where = '1=1'
...
...
...
cur.execute(f'select {predicate} from {table_name} where {_where}')

그 이유는 _where 절 변수 안에서 키워드 'where'를 함께 구현할 수 없었기 때문입니다.그래서, 저는 진실로 평가되는 더미 조건을 사용하는 것이 필러로 충분하다고 생각합니다.

언급URL : https://stackoverflow.com/questions/242822/why-would-someone-use-where-1-1-and-conditions-in-a-sql-clause

반응형