복붙노트

[SQL] 왜 것 사람이 사용 WHERE 1 = 1 AND <조건>은 SQL 절의?

SQL

왜 것 사람이 사용 WHERE 1 = 1 AND <조건>은 SQL 절의?

왜하고자 사람 사용 WHERE 1 = 1, <조건>은 SQL 절에서 (어느 쪽이든 하나가 SQL 뷰 정의에 연결된 스트링을 통해 얻어진)

나는이 SQL 주입을 방지하기 위해 사용되는 것을 곳을 본 적이 있지만 그것은 매우 이상한 것 같다.

= 1 주사 또는 1 = 1 AND 주입 OR = 1이 같은 결과를 가질 것이다 주입이있는 경우.

나중에 편집 : 뷰 정의의 사용에 대한 무엇?

귀하의 답변 주셔서 감사합니다.

아직도, 누군가가보기를 정의하는이 구조를 사용하거나 저장 프로 시저 내에서 그것을 사용하는 것이 왜 이해가 안 돼요.

예를 들어이 걸릴 :

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

해결법

  1. ==============================

    1.조건 목록은 컴파일 타임에 알 수없는 대신 런타임에 내장되어있는 경우, 당신은 당신이 하나 이상의 조건을 가지고 있는지에 대해 걱정할 필요가 없습니다. 당신은 그들을 모두 같이 생성 할 수 있습니다 :

    조건 목록은 컴파일 타임에 알 수없는 대신 런타임에 내장되어있는 경우, 당신은 당신이 하나 이상의 조건을 가지고 있는지에 대해 걱정할 필요가 없습니다. 당신은 그들을 모두 같이 생성 할 수 있습니다 :

    and <condition>
    

    모든 그들을 함께 연결하여. 시작시 1 = 1로, 초기 및과 연관 뭔가가있다.

    당신이 많은 도움이 될 것처럼 보이지 않는다 말한대로 나는, 사출 보호의 모든 종류의 사용이 본 적이 없어. 나는 그것이 구현의 편리 성으로 사용 보았다. 이 성능에 영향이 없어야하므로 SQL 쿼리 엔진은 1 = 1을 무시하고 종료됩니다.

  2. ==============================

    2.그냥 그렉의 대답에 예제 코드를 추가 :

    그냥 그렉의 대답에 예제 코드를 추가 :

    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
    
  3. ==============================

    3.나는 조건의 수는 변수가 될 수 있습니다 때 사용 보았다.

    나는 조건의 수는 변수가 될 수 있습니다 때 사용 보았다.

    당신은 "AND"문자열을 사용하여 조건을 연결할 수 있습니다. 그럼, 대신 당신이 전달하는 조건의 수를 계산, 당신은 장소에 "WHERE 1 = 1"연결된 상태에서 당신의 주식 SQL 문의 끝에와 던져.

    기본적으로, 당신이 조건에 대한 테스트를 수행 한 다음 이전에 "WHERE"문자열을 추가 할 필요 절약 할 수 있습니다.

  4. ==============================

    4.항상 절을 이미 정의하고 당신이 첫 번째인지 확인하지 않고 조건을 계속 추가 할 수 있도록 위치를 알고 게으른 방법처럼 보인다.

    항상 절을 이미 정의하고 당신이 첫 번째인지 확인하지 않고 조건을 계속 추가 할 수 있도록 위치를 알고 게으른 방법처럼 보인다.

  5. ==============================

    5.간접적으로 관련 : 1 = 2를 사용하는 경우 :

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

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

    이것은 이전 테이블과 동일한 스키마를 새 테이블을 생성합니다. (당신이 비교를 위해 일부 데이터를로드 할 경우 매우 유용)

  6. ==============================

    6.1 = 1 발현은 일반적으로 생성 된 SQL 코드가 사용된다. 이 표현은 조건문의 수를 줄여 SQL 생성 코드를 단순화 할 수 있습니다.

    1 = 1 발현은 일반적으로 생성 된 SQL 코드가 사용된다. 이 표현은 조건문의 수를 줄여 SQL 생성 코드를 단순화 할 수 있습니다.

  7. ==============================

    7.사실, 난 BIRT 보고서에 사용되는 이런 종류의 물건을 본 적이있다. BIRT 런타임에 전달 된 질의는 다음 형식이다 :

    사실, 난 BIRT 보고서에 사용되는 이런 종류의 물건을 본 적이있다. BIRT 런타임에 전달 된 질의는 다음 형식이다 :

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

    그리고 '?' 드롭 다운 박스로부터 선택된 실제 파라미터 값에 의해 실행시에 교체된다. 드롭 다운의 선택이 주어진다 :

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

    그래서 당신은 "*"가능한 모든 값을 가져 더한 것이다. "*"드롭 다운 상자에서 사용자가 선택 (A의 모든 값을 의미 선택해야한다)하는 경우 쿼리가 실행되기 전에 (자바 스크립트에 의해) 수정해야합니다.

    이후 "?" 위치 매개 변수이며, 작업을 다른 작업이 남아 있어야, 자바 스크립트가 될 쿼리를 수정합니다 :

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

    아직도 그 자리에 위치 매개 변수를 떠나있는 동안 즉 기본적으로 where 절의 효과를 제거합니다.

    또한 동적 SQL 쿼리를 작성하는 동안 게으른 코더에 의해 사용되는 및 사례를 본 적이있다.

    동적 쿼리를 만들 필요가 말해 그 t 및 검사에서 선택 *로 시작하는 :

    어떤 사람들은, 따라서 AND와 WHERE 이후의 사람과 처음을 추가합니다 :

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

    게으른 프로그래머 (그의 반드시 나쁜 특성) 추가 조건을 구분하지 것이다, 그들은 1 = 1 단지 그 후 추가 조항 t에서 선택 *로 시작하는 것입니다.

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

    8.여기서 1 = 0, 이는 테이블이 존재하는지 확인하기위한 것입니다. 1 = 1을 사용하는 이유를 알고하지 마십시오.

    여기서 1 = 0, 이는 테이블이 존재하는지 확인하기위한 것입니다. 1 = 1을 사용하는 이유를 알고하지 마십시오.

  9. ==============================

    9.나는 매우 빠르게 다른 조건을 언급 할 수 있도록 내가 데이터베이스에서 테스트 또는 더블 체크 일있을 때 나는이 패턴을 유용하다고 :

    나는 매우 빠르게 다른 조건을 언급 할 수 있도록 내가 데이터베이스에서 테스트 또는 더블 체크 일있을 때 나는이 패턴을 유용하다고 :

    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
    
  10. ==============================

    10.나는 1 = 1이 생성 된 SQL에 유용 할 것이라고 볼 수 있지만, PHP의 기술 I의 사용 조항의 배열을 만드는 것입니다 다음 할

    나는 1 = 1이 생성 된 SQL에 유용 할 것이라고 볼 수 있지만, PHP의 기술 I의 사용 조항의 배열을 만드는 것입니다 다음 할

    implode (" AND ", $clauses);
    

    따라서, 선행 또는 후행 갖는 AND 문제를 회피. 당신은 당신이 적어도 하나의 절을 가질려고하고 있다는 것을 알고 있다면 분명히에만 유용합니다!

  11. ==============================

    11.여기에 밀접한 관련이 예는 다음과 같습니다 상정 예를 들어, 조인에 공통 속성이없는 소스 테이블에서 모든 값을 사용하여 대상을 업데이트하기 위해 SQL 병합 문을 사용하여

    여기에 밀접한 관련이 예는 다음과 같습니다 상정 예를 들어, 조인에 공통 속성이없는 소스 테이블에서 모든 값을 사용하여 대상을 업데이트하기 위해 SQL 병합 문을 사용하여

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

    12.나는이 게으른 구문 분석 방식 모두에 WHERE 및 및 SQL 키워드를 적용 할 수 있습니다로 짠 프레임 워크는이 (홍당무) 등의 물건을 보았다.

    나는이 게으른 구문 분석 방식 모두에 WHERE 및 및 SQL 키워드를 적용 할 수 있습니다로 짠 프레임 워크는이 (홍당무) 등의 물건을 보았다.

    예를 들어 SQL 쿼리 문자열 빌더에서 다음과 같은 조건의 조건 구문 분석을 고려, (여기 예제로 C #을 사용하고 있습니다)

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

    1 = 1 수단 특별한 코드가 필요하지 않습니다 것을 WHERE의 "혜택"

    이것은 분명히 잘못된 생각이며,이 방법으로 선택 조건부 술어 구문 분석에 대한 확립 된 데이터 액세스 프레임 워크 또는 ORM을 사용하는 것이 좋습니다 것입니다.

  13. ==============================

    13.당신은 1, 참고 WHERE 1 있고 WHERE 1 = 1이 동일한 WHERE 검색 여기 온 경우. (1)가 거의 사용되지 WHERE 일부 데이터베이스 시스템은 하나 정말 부울없는 곳은 고려 거부하기 때문이다.

    당신은 1, 참고 WHERE 1 있고 WHERE 1 = 1이 동일한 WHERE 검색 여기 온 경우. (1)가 거의 사용되지 WHERE 일부 데이터베이스 시스템은 하나 정말 부울없는 곳은 고려 거부하기 때문이다.

  14. ==============================

    14.당신이하는 동적 쿼리를 사용해야하는 곳은 경우에 유용합니다 절은 몇 가지 필터 옵션을 추가해야합니다. 당신이 옵션을 포함 할 경우 상태를 0 활성 1, 비활성처럼. 옵션에서 바탕으로, 두 사용할 수있는 옵션 (0과 1)이 있지만 모든 레코드를 표시하려면, 어디 가까운 1 = 1에 포함 편리합니다. 샘플 아래를 참조하십시오 :

    당신이하는 동적 쿼리를 사용해야하는 곳은 경우에 유용합니다 절은 몇 가지 필터 옵션을 추가해야합니다. 당신이 옵션을 포함 할 경우 상태를 0 활성 1, 비활성처럼. 옵션에서 바탕으로, 두 사용할 수있는 옵션 (0과 1)이 있지만 모든 레코드를 표시하려면, 어디 가까운 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);
    
  15. ==============================

    15.검토 모든 해답을 가지고 내가 같은 몇 가지 실험을 수행하기로 결정

    검토 모든 해답을 가지고 내가 같은 몇 가지 실험을 수행하기로 결정

    SELECT
    *
    FROM MyTable
    
    WHERE 1=1
    

    그럼 난 다른 번호로 확인

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

    요법 수행하는 모든 검사 갖는 쿼리 실행 마을은 동일합니다. 심지어 WHERE 절없이. 나는 구문의 팬이 아니다

  16. ==============================

    16.나는 사용자가 선택할 수있는 많은 드롭 다운 값이 보고서에 대해 동적 SQL을 구축하고 때 나는 보통이 작업을 수행. 사용자가 각 드롭 다운에서 값을 선택하지 않을 수 있기 때문에, 우리는 where 절 처음이었다 조건을 알아내는 힘든 시간을 받고 결국. 결국 1 = 1이 곳에 절을 한 후 모든를 추가로 질의까지 우리가 패드 그래서.

    나는 사용자가 선택할 수있는 많은 드롭 다운 값이 보고서에 대해 동적 SQL을 구축하고 때 나는 보통이 작업을 수행. 사용자가 각 드롭 다운에서 값을 선택하지 않을 수 있기 때문에, 우리는 where 절 처음이었다 조건을 알아내는 힘든 시간을 받고 결국. 결국 1 = 1이 곳에 절을 한 후 모든를 추가로 질의까지 우리가 패드 그래서.

    같은 뭔가

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

    그럼 우리는 다음과 같이 WHERE 절을 구축하고 매개 변수 값으로 전달할 것

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

    이것이 'AND'또는 'WHERE'를 포함할지 여부를 찾는 우리에게 큰 거래를 할 수 있도록 where 절 선택으로, 런타임에 우리에게 알려져 있지 않다.

  17. ==============================

    17.1 = 1과 같은 조건을 사용하면 때때로 인덱스 스캔을 사용하여 사용하거나하지 않도록 액세스 플랜을 강제하는 데 사용되는 일반적인 힌트입니다. 전체 테이블 스캔 - 때로는 모든 인덱스는 각 테이블을 읽을 수있는 액세스 플랜을 야기 사용하여 위치를 where 절에있는 많은 조건을 가진 다중 중첩 합류 쿼리를 사용하는 경우이 사용하는 이유는 다음과 같다. 이것은 단지 1보다 효율적인 경로를 사용으로 DBMS를 속여 DBA가 사용하는 많은 힌트입니다. 그냥 하나를 포기하지 않는다; 항상 작동하지 않기 때문에 당신은 쿼리를 분석하기 위해 DBA가 필요합니다.

    1 = 1과 같은 조건을 사용하면 때때로 인덱스 스캔을 사용하여 사용하거나하지 않도록 액세스 플랜을 강제하는 데 사용되는 일반적인 힌트입니다. 전체 테이블 스캔 - 때로는 모든 인덱스는 각 테이블을 읽을 수있는 액세스 플랜을 야기 사용하여 위치를 where 절에있는 많은 조건을 가진 다중 중첩 합류 쿼리를 사용하는 경우이 사용하는 이유는 다음과 같다. 이것은 단지 1보다 효율적인 경로를 사용으로 DBMS를 속여 DBA가 사용하는 많은 힌트입니다. 그냥 하나를 포기하지 않는다; 항상 작동하지 않기 때문에 당신은 쿼리를 분석하기 위해 DBA가 필요합니다.

  18. ==============================

    18.내가 처음 ADO와 기존 ASP이 다시 건너 왔어요, 내가 가진 대답했다 : 성능. 당신은 직선을 할 경우

    내가 처음 ADO와 기존 ASP이 다시 건너 왔어요, 내가 가진 대답했다 : 성능. 당신은 직선을 할 경우

    TABLENAME에서 선택 *

    과의 SQL 명령 / 텍스트로 당신이 가진 눈에 띄는 성능 향상을 얻을 것이다 통과

    어디 1 = 1

    첨가는 가시 차이였다. 테이블 헤더 함께 할 수있는 뭔가가 첫 번째 조건이 충족되는 즉시 반환, 또는 다른 막무가내 어쨌든, 그것은 속도 물건을했다.

  19. from https://stackoverflow.com/questions/242822/why-would-someone-use-where-1-1-and-conditions-in-a-sql-clause by cc-by-sa and MIT license