복붙노트

[SQL] SQLite는에 변수를 선언하고 사용

SQL

SQLite는에 변수를 선언하고 사용

나는 SQLite는의 변수를 선언 할 및 삽입 작업에 사용합니다.

MS SQL에서와 마찬가지로 :

declare @name as varchar(10)
set name = 'name'
select * from table where name = @name

예를 들어, 나는 LAST_INSERT_ROWID 얻고 삽입에서 사용해야합니다.

나는 바인딩에 대해 뭔가를 발견하지만 난 정말 완전히 이해하지 않았다.

해결법

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

    1.SQLite는 네이티브 변수 구문을 지원하지 않지만, 당신은 메모리 임시 테이블을 사용하여 거의 동일한 달성 할 수있다.

    SQLite는 네이티브 변수 구문을 지원하지 않지만, 당신은 메모리 임시 테이블을 사용하여 거의 동일한 달성 할 수있다.

    나는 마법 같은 대규모 프로젝트와 작품에 대한 아래의 방법을 사용했습니다.

        /* Create in-memory temp table for variables */
        BEGIN;
    
        PRAGMA temp_store = 2;
        CREATE TEMP TABLE _Variables(Name TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT);
    
        /* Declaring a variable */
        INSERT INTO _Variables (Name) VALUES ('VariableName');
    
        /* Assigning a variable (pick the right storage class) */
        UPDATE _Variables SET IntegerValue = ... WHERE Name = 'VariableName';
    
        /* Getting variable value (use within expression) */
        ... (SELECT coalesce(RealValue, IntegerValue, BlobValue, TextValue) FROM _Variables WHERE Name = 'VariableName' LIMIT 1) ...
    
        DROP TABLE _Variables;
        END;
    
  2. ==============================

    2.허먼의 솔루션은 작동하지만, SQLite는 어떤 필드에 모든 값 유형을 저장할 수 있기 때문에 간단하게 할 수 있습니다.

    허먼의 솔루션은 작동하지만, SQLite는 어떤 필드에 모든 값 유형을 저장할 수 있기 때문에 간단하게 할 수 있습니다.

    여기에 사용하는 하나 개의 값 필드에 값을 저장하기 위해 텍스트로 선언하는 간단한 버전입니다 :

    CREATE TEMP TABLE IF NOT EXISTS Variables (Name TEXT PRIMARY KEY, Value TEXT);
    
    INSERT OR REPLACE INTO Variables VALUES ('VarStr', 'Val1');
    INSERT OR REPLACE INTO Variables VALUES ('VarInt', 123);
    INSERT OR REPLACE INTO Variables VALUES ('VarBlob', x'12345678');
    
    SELECT Value
      FROM Variables
     WHERE Name = 'VarStr'
    UNION ALL
    SELECT Value
      FROM Variables
     WHERE Name = 'VarInt'
    UNION ALL
    SELECT Value
      FROM Variables
     WHERE Name = 'VarBlob';
    
  3. ==============================

    3.(이다, 상수 값 한 번 세트와 쿼리에 사용 어디서나) 읽기 전용 변수의 경우, 공통 테이블 식 (CTE)를 사용합니다.

    (이다, 상수 값 한 번 세트와 쿼리에 사용 어디서나) 읽기 전용 변수의 경우, 공통 테이블 식 (CTE)를 사용합니다.

    WITH const AS (SELECT 'name' AS name, 10 AS more)
    SELECT table.cost, (table.cost + const.more) AS newCost
    FROM table, const 
    WHERE table.name = const.name
    

    SQLite는 함께 절

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

    4.허먼의 솔루션은 나를 위해 일하지만,이 ... 나 조금 혼합했다. 나는 그의 대답에 따라 흥분 데모를 포함하고 있습니다. 내 대답에 추가 기능은 외래 키 지원, 자동 증가 키와 LAST_INSERT_ROWID () 함수의 사용 트랜잭션의 마지막 자동 생성 된 키를 얻을 수를 포함한다.

    허먼의 솔루션은 나를 위해 일하지만,이 ... 나 조금 혼합했다. 나는 그의 대답에 따라 흥분 데모를 포함하고 있습니다. 내 대답에 추가 기능은 외래 키 지원, 자동 증가 키와 LAST_INSERT_ROWID () 함수의 사용 트랜잭션의 마지막 자동 생성 된 키를 얻을 수를 포함한다.

    나는 세 개의 외래 키를 필요로하는 트랜잭션을 명중 할 때이 정보에 대한 나의 필요를 내놓았다하지만 난 단지 LAST_INSERT_ROWID와 마지막 ()을 얻을 수 있습니다.

    PRAGMA foreign_keys = ON;   -- sqlite foreign key support is off by default
    PRAGMA temp_store = 2;      -- store temp table in memory, not on disk
    
    CREATE TABLE Foo(
        Thing1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
    );
    
    CREATE TABLE Bar(
        Thing2 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        FOREIGN KEY(Thing2) REFERENCES Foo(Thing1)
    );
    
    BEGIN TRANSACTION;
    
    CREATE TEMP TABLE _Variables(Key TEXT, Value INTEGER);
    
    INSERT INTO Foo(Thing1)
    VALUES(2);
    
    INSERT INTO _Variables(Key, Value)
    VALUES('FooThing', last_insert_rowid());
    
    INSERT INTO Bar(Thing2)
    VALUES((SELECT Value FROM _Variables WHERE Key = 'FooThing'));
    
    DROP TABLE _Variables;
    
    END TRANSACTION;
    
  5. ==============================

    5.바인딩 값을 사용해보십시오. 당신이 T-SQL에서와 같이 변수를 사용할 수 있지만 "매개 변수"를 사용할 수 있습니다. 나는 다음과 같은 링크 값을 usefull.Binding 희망

    바인딩 값을 사용해보십시오. 당신이 T-SQL에서와 같이 변수를 사용할 수 있지만 "매개 변수"를 사용할 수 있습니다. 나는 다음과 같은 링크 값을 usefull.Binding 희망

  6. from https://stackoverflow.com/questions/7739444/declare-variable-in-sqlite-and-use-it by cc-by-sa and MIT license