SQLite में वैरिएबल की घोषणा करें और इसका उपयोग करें


94

मैं SQLite में एक चर घोषित करना चाहता हूं और इसे insertऑपरेशन में उपयोग करना चाहता हूं ।

जैसे MS SQL में:

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

उदाहरण के लिए, मुझे last_insert_rowइसे प्राप्त करने और उपयोग करने की आवश्यकता होगी insert

मुझे बंधन के बारे में कुछ पता चला है लेकिन मैं वास्तव में इसे पूरी तरह से समझ नहीं पाया हूं।


7
sqlite इसका समर्थन नहीं करता है।
डैन डी।

2
उम्मीद है कि अब एक बेहतर समाधान है - Aug 2018
MarshallMa

जवाबों:


93

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;

ये [] कोष्ठक किसके लिए उपयोग किए जाते हैं?
विंडराइड सेप

1
@IndRider: आरक्षित शब्दों के साथ किसी भी झड़प से बचने के लिए। मेरी आदत है लेकिन इस मामले में अनावश्यक है, इसलिए उन्हें हटा दिया जाता है।
हरमन शोनीफेल्ड

2
यह काम करता है लेकिन कुछ टिप्पणियां हैं, मैंने स्पैटियालाइट पर यह कोशिश की, और वहां यह कहता है कि आप एक लेनदेन के भीतर से टेम्प स्टोर को नहीं बदल सकते। इसके अलावा, मुझे लगता है कि आपको BEGIN के बाद एक अर्धविराम याद आ रहा है। इस समाधान को साझा करने के लिए टीएक्स।
ग्लेन प्लास

इसे कैसे बढ़ाया जाए? मेरा मतलब है कि इस चर को कैसे बढ़ाया जाए जैसे कि यह अनुक्रमिक कॉल के साथ वृद्धि करता है।
विभु जैन

2
अस्थायी तालिकाओं को स्मृति में होने की गारंटी नहीं है । यह संकलक विकल्प और 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';

3
लेकिन आपको सही प्रकार का मान डालने की भूल नहीं करनी चाहिए यदि आप इसे तुलना में उपयोग करना चाहते हैं या आपको आश्चर्यजनक परिणाम मिल सकते हैं
vlad_tepesch

33

रीड-ओनली वेरिएबल के लिए (अर्थात, क्वेरी में कहीं भी एक बार सेट और उपयोग किया जाने वाला एक स्थिर मान), एक कॉमन टेबल एक्सप्रेशन (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


2
यह सबसे सुरुचिपूर्ण उत्तर imo है
व्लादटन

1
यह उस प्रकार का उत्तर है जिसकी मुझे तलाश थी।
जॉन बैबर-लुसेरो

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;

धन्यवाद अच्छा उदाहरण के लिए, वास्तव में बहुत अधिक उपयोगी है कि राय और लिंक
splaisan

-1

बाइंडिंग मान का उपयोग करने का प्रयास करें। आप चर का उपयोग नहीं कर सकते जैसा कि आप टी-एसक्यूएल में करते हैं लेकिन आप "पैरामीटर" का उपयोग कर सकते हैं। मुझे उम्मीद है कि निम्नलिखित लिंक उपयोगी है। बंधन मान


26
आप अपने उत्तर को समृद्ध उदाहरण प्रदान कर सकते हैं। लिंक को स्थानांतरित किया जा सकता है लेकिन आपके उदाहरण भविष्य के संदर्भ के लिए यहां होंगे।
पबल्यूज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.