2012-11-06 12 views
9

में चयन:SQLite - चुनें या डालें और एक बयान मैं इस परिदृश्य पर प्राप्त करने के लिए विभिन्न एसक्यूएल प्रश्नों लेखन से बचने के लिए कोशिश कर रहा हूँ

मान::

id INT (PK) 
data TEXT 

मैं एक टेबल बुलाया मान है

मैं यह जांचना चाहता हूं कि तालिका में कोई निश्चित डेटा मौजूद है या नहीं, अगर यह वापस आ गया है, तो यह आईडी है, यदि यह अस्तित्व में नहीं है, तो उसे डालें और इसकी आईडी वापस कर दें।

(बहुत) अनुभवहीन तरीका होगा:

select id from Values where data = "SOME_DATA"; 

यदि आईडी शून्य नहीं है, बहुत काम यह। यदि आईडी तो रिक्त है:

insert into Values(data) values("SOME_DATA"); 

और उसके बाद अपने आईडी देख सकते हैं या लौट आए आईडी का उपयोग करने के लिए फिर से उसका चयन करें।

मैं उपरोक्त कार्यक्षमता को एक पंक्ति में बनाने की कोशिश कर रहा हूं। मुझे लगता है कि मैं पास हो रही है, लेकिन मैं अभी तक यह नहीं कर सकता है:

select id from Values where data=(COALESCE((select data from Values where data="SOME_DATA"), (insert into Values(data) values("SOME_DATA")); 

मैं इस तथ्य का लाभ लेने के उस दूसरे का चयन अशक्त वापस आ जाएगी कोशिश कर रहा हूँ और: अब तक मैं यह मिल गया तो COALESCE को दूसरा तर्क वापस कर दिया जाएगा। अब तक कोई सफलता नहीं है। मैं क्या खो रहा हूँ?

अनुस्मारक, यह एक वर्ग 3 इंजन है! : पी

धन्यवाद!

+0

MySQL टैग क्यों? –

+0

बहुत सारी समानताएं हैं, शायद उत्तर MySQL थ्रेड से आएगा: पी – user1782427

+0

जो व्यवहार आप चाहते हैं वह विक्रेता-विशिष्ट है। कुछ विक्रेता सम्मिलित/अद्यतन आदेशों से सम्मिलित/हटाए गए मान वापस करने का एक तरीका प्रदान करते हैं। उदाहरण के लिए, SQL सर्वर में आप लॉकिंग के बिना OUTPUT क्लॉज का उपयोग करके एक नई आईडी आउटपुट कर सकते हैं, जबकि MySQL में LAST_INSERT_ID है जो पिछले ऑटो-जेनरेट आईडी –

उत्तर

9

आपका आदेश काम नहीं करता क्योंकि SQL में, INSERT कोई मान नहीं देता है।

यदि आपके पास data कॉलम पर एक अद्वितीय बाधा/अनुक्रमणिका है, तो आप डुप्लिकेट को रोकने के लिए इसका उपयोग कर सकते हैं यदि आप अंधाधुंध मूल्य डालते हैं; यह SQLite's INSERT OR IGNORE extension का उपयोग करता है:

INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE'); 
SELECT id FROM "Values" WHERE data = 'SOME_DATA'; 
+0

को वापस करने के लिए देखता है, इसलिए आप किसी भी तरह से डालने का सुझाव देते हैं (सबसे खराब स्थिति इसे अनदेखा कर दिया जाएगा) और फिर चुनें। मैं इसे एक लाइनर में करने की कोशिश कर रहा था, लेकिन काम नहीं कर रहा था। धन्यवाद! – user1782427

संबंधित मुद्दे

 संबंधित मुद्दे