এসকিউএলাইটে পরিবর্তনশীল ঘোষণা করুন এবং এটি ব্যবহার করুন


94

আমি এসকিউএলাইটে একটি ভেরিয়েবল ঘোষণা করতে এবং এটি কার্যকরভাবে ব্যবহার করতে চাই insert

এমএস এসকিউএল এর মতো:

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

উদাহরণস্বরূপ, আমার last_insert_rowএটি পেতে এবং এটি ব্যবহার করা দরকার insert

বাইন্ডিং সম্পর্কে আমি কিছু খুঁজে পেয়েছি তবে আমি সত্যিই এটি পুরোপুরি বুঝতে পারি নি।


7
স্ক্লাইট এই সমর্থন করে না।
ড্যান ডি

4
ভাল সমাধান এখন আশা - আগস্ট 2018
MarshallMa

উত্তর:


93

এসকিউএলাইট নেটিভ ভেরিয়েবল সিনট্যাক্স সমর্থন করে না, তবে আপনি ইন-মেমরি টেম্প টেবিলটি ব্যবহার করে কার্যত একইটি অর্জন করতে পারেন।

আমি বড় প্রকল্পগুলির জন্য নীচের পদ্ধতির ব্যবহার করেছি এবং একটি কবজির মতো কাজ করি।

    /* 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;

এই [] বন্ধনীগুলি কীসের জন্য ব্যবহৃত হয়?
উইন্ডারাইডার

4
@ উইন্ড্রাইডার: সংরক্ষিত শব্দের সাথে কোনও সংঘাত এড়াতে। আমার একটি অভ্যাস তবে এক্ষেত্রে অপ্রয়োজনীয় তাই সেগুলি সরিয়ে দেওয়া হয়েছে।
হারমান শোএনফিল্ড

4
এটি কাজ করে তবে কয়েকটি মন্তব্য রয়েছে, আমি এটি স্থানিক সম্পর্কে চেষ্টা করেছি এবং সেখানে এটি বলেছে আপনি কোনও লেনদেনের মধ্য দিয়ে টেম্প স্টোরটি পরিবর্তন করতে পারবেন না। এছাড়াও, আমি মনে করি আপনি বিগিনের পরে একটি সেমিকোলন মিস করছেন। এই সমাধানটি ভাগ করে নেওয়ার জন্য টিএক্স।
গ্লেন প্লস

এটি কীভাবে বাড়ানো যায়? আমি বোঝাতে চাইছি কীভাবে এই পরিবর্তনশীলটিকে বাড়ানো যায় যেন এটি ক্রমবর্ধমান কলগুলির সাথে বৃদ্ধি পায়।
বিভূ জৈন

4
অস্থায়ী টেবিলগুলি মেমরির থাকার গ্যারান্টিযুক্ত নয় । এটি সংকলক বিকল্পগুলি এবং PRAGMA temp_storeসেটিংসের উপরও নির্ভর করে । প্রকৃতপক্ষে, অনলাইন ডক্স অনুসারে , ডিফল্ট সেটিংটি অস্থায়ীভাবে ডিস্কে ফাইলগুলি সংরক্ষণ করা হয় (এতে অস্থায়ী টেবিল এবং সূচকগুলির জন্য ফাইল অন্তর্ভুক্ত থাকে)।
সি পার্কিনস

43

হারমানের সমাধানটি কাজ করে তবে এটিকে আরও সহজ করা যায় কারণ স্ক্লাইট যে কোনও ক্ষেত্রে যে কোনও মান ধরণের সঞ্চয় করতে দেয়।

এখানে একটি সহজ সংস্করণ যা কোনও মান সংরক্ষণের জন্য Valueঘোষিত একটি ক্ষেত্র ব্যবহার করে TEXT:

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';

4
তবে আপনি যদি এটির তুলনা করে ব্যবহার করতে চান বা সঠিক ধরণের মানটি ভুলে যাওয়া উচিত নয় বা অবাক করে দেওয়ার ফলাফল পেতে পারেন
vlad_tepesch

33

কেবল পঠনযোগ্য ভেরিয়েবলের জন্য (এটি, একবারে ধ্রুবক মান সেট করা হয় এবং কোয়েরিতে যে কোনও জায়গায় ব্যবহৃত হয়), একটি সাধারণ ছক এক্সপ্রেশন (সিটিই) ব্যবহার করুন।

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

ধারা সহ এসকিউএলাইট


4
এটি সবচেয়ে মার্জিত উত্তর ইমো
ভ্লাদ্টন

4
আমি যে উত্তরটির সন্ধান করছিলাম এটি এটি।
জন ব্যাবার-লুসরো

9

হারম্যানের সমাধানটি আমার পক্ষে কাজ ...করেছিল , তবে আমাকে কিছুটা মিশিয়ে দিয়েছে। আমি তার উত্তরের উপর ভিত্তি করে কাজ করেছি ডেমো আমি অন্তর্ভুক্ত করছি। আমার উত্তরের অতিরিক্ত বৈশিষ্ট্যগুলির মধ্যে রয়েছে বিদেশী কী সমর্থন, অটো ইনক্রিমেন্টিং কী এবং এর ব্যবহার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;

সুন্দর উদাহরণের জন্য ধন্যবাদ, প্রকৃতপক্ষে আরও অনেক কার্যকর যে মতামত এবং লিঙ্কগুলি
স্প্লাইসান

-1

বাইন্ডিং মানগুলি ব্যবহার করার চেষ্টা করুন। আপনি টি-এসকিউএল হিসাবে ভেরিয়েবল ব্যবহার করতে পারবেন না তবে আপনি "পরামিতি" ব্যবহার করতে পারেন। আমি আশা করি নীচের লিঙ্কটি কার্যকর। বাঁধার মান


26
আপনি আপনার উত্তরকে আরও উন্নততর উদাহরণ প্রদান করতে পারেন। লিঙ্কগুলি সরানো যেতে পারে তবে ভবিষ্যতের রেফারেন্সের জন্য আপনার উদাহরণগুলি এখানে থাকবে।
পাব্লুয়েজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.