MySQL

2012-11-03 18 views
30

में खंड पैरामीटर सूची में खाली करें जब आप SQL क्वेरी करते हैं तो IN खंड खाली होता है तो क्या होता है?MySQL

उदाहरण के लिए:

SELECT user WHERE id IN(); 

MySQL अपेक्षा के अनुरूप (है कि, हमेशा गलत है), और यदि नहीं, कैसे अपने आवेदन जब IN खंड गतिशील निर्माण इस मामले को संभाल सकता है इस संभाल होगा?

+9

अपने आप को क्यों न करें? –

+0

आईडी कॉलम मान स्पष्ट रूप से खाली सेट में नहीं है, क्योंकि कुछ खाली सेट में नहीं है। साथ ही, यह पता चला है कि गलत वाक्यविन्यास है। http://sqlfiddle.com/#!2/a2581/2412 –

+9

मैं इसे SO पर पूछने से परेशान नहीं करता, लेकिन इसे पहले से ही ढूंढना सुविधाजनक था। –

उत्तर

10

मान्य सिंटैक्स के साथ आपकी क्वेरी के निकटतम अनुमान होता है:

SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE); 

जो बिना शर्त एक खाली परिणाम सेट वापस आ जाएगी। ब्रैकेट में उपकुंजी हमेशा एक खाली सेट लौटाती है, और जैसा कि मैंने पहले उल्लेख किया था, खाली सेट में कोई मूल्य नहीं पाया जा सकता है, क्योंकि एक खाली सेट में कोई मान नहीं है।

+3

एक और सबक्वायरी जो खाली सेट देता है वह '(शीर्ष 0 0 का चयन करें) 'है, जिसका लाभ तालिका नाम की आवश्यकता नहीं है। – benrwb

+4

यह वास्तव में उस मामले में सहायता नहीं करता है जहां आप गतिशील रूप से एक शाब्दिक 'IN' सूची उत्पन्न कर रहे हैं। वह एक खाली 'इन' खंड बनाने का कोई तरीका नहीं ढूंढ रहा है, वह जानना चाहता है कि जब यह गलती से होता है तो उससे निपटने के लिए कैसे किया जाता है क्योंकि उसे मूल्यों की एक खाली सरणी दी जाती है। – Barmar

+0

या बस 'टीएलबी 1 से आईडी चुनें जहां आईडी (गलत) ' –

32

यदि मेरे पास कोई एप्लिकेशन है जहां मैं IN गतिशील रूप से सूची बना रहा हूं, और यह खाली हो सकता है, तो मैं कभी-कभी जो असंभव मान के साथ सूची को प्रारंभ करता हूं और उसमें जोड़ता हूं। जैसे अगर यह उपयोगकर्ता नामों की एक सूची है, तो मैं एक खाली स्ट्रिंग से शुरू करूंगा, क्योंकि यह संभव उपयोगकर्ता नाम नहीं है। यदि यह एक auto_increment आईडी है, तो मैं -1 का उपयोग करूंगा क्योंकि वास्तविक मान हमेशा सकारात्मक होते हैं।

यदि यह संभव नहीं है क्योंकि कोई असंभव मान नहीं है, तो आपको यह तय करने के लिए एक सशर्त उपयोग करना होगा कि AND column IN ($values) अभिव्यक्ति WHERE खंड में शामिल है या नहीं।

0

तुम बस इतना की तरह हालत सेट कर सकते हैं:

$condition = 'FALSE' // Could feasibly want TRUE under different circumstances 
if($values){ 
    $condition = *dynamically_generate_IN_condition_from_values* 
} 

$sql = 'SELECT * FROM `user` WHERE '.$condition; 
7

यह मैं देता 0 परिणामों के साथ-साथ:

SELECT id FROM User 
WHERE id IN (NULL); 

MYSQL पर की कोशिश की 5.6

+2

यह समस्याग्रस्त हो सकता है क्योंकि 'आईडी इन (एनयूएलएल)' 'NULL' का मूल्यांकन करता है और 'गलत नहीं'। यह ज्यादातर 'इन नहीं' के लिए एक समस्या है: 'उपयोगकर्ता से चुनें आईडी जहां आईडी नहीं है (न्यूल);' 0 परिणाम भी वापस कर देगा। – MicahStetson

0

उपयोग एक हमेशा झूठा बयान

एसक्यूएल बनाने से पहले, सरणी आकार की जांच करें। आकार 0 हैं, तो, 1 = 2 के रूप में जहां बयान उत्पन्न के रूप में में:

SELECT * FROM USERS WHERE name in() 

के लिए "नहीं" में एक खाली सरणी पर, के रूप में एक हमेशा सच बयान उत्पन्न

SELECT * FROM USERS WHERE 1 = 2 

हो जाता है:

SELECT * FROM USERS WHERE name not in() 

हो जाता है

SELECT * FROM USERS WHERE 1 = 1 

इस रूप में और अधिक जटिल प्रश्नों के लिए काम करना चाहिए:

SELECT * FROM USERS WHERE (name in() OR name = 'Alice') 

SELECT * FROM USERS WHERE (1 = 2 OR name = 'Alice') 
0

हो जाता है (.. 1,2,3) उसकी पहचान के लिए AUTO_INCREMENT का उपयोग करते हैं और यदि सरणी खाली है, आप एक आइटम जोड़ सकते हैं [0]।तो यह

if (empty($arr)) { 
    $arr[] = 0; 
} 

SELECT user WHERE id IN (0); 

और कोई mysql पार्स त्रुटि नहीं होगी।