2010-03-06 23 views
15
CREATE TABLE `mycompare` (
    `name` varchar(100) default NULL, 
    `fname` varchar(100) default NULL, 
    `mname` varchar(100) default NULL, 
    `lname` varchar(100) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `mycompare` VALUES('amar', 'ajay', 'shankar', NULL); 
INSERT INTO `mycompare` VALUES('akbar', 'bhai', 'aslam', 'akbar'); 
INSERT INTO `mycompare` VALUES('anthony', 'john', 'Jim', 'Ken'); 
_____ 

SELECT * FROM mycompare WHERE (name = fname OR name = mname OR name = lname) 
akbar bhai aslam akbar 

select * from mycompare where !(name = fname OR name = mname OR name = lname) 
anthony john Jim Ken 

उपरोक्त दूसरे चयन में, मुझे "अमार" रिकॉर्ड भी उम्मीद है क्योंकि वह नाम पहले, दूसरे या अंतिम नाम से मेल नहीं खाता है।नल मानों की तुलना

उत्तर

28

NULL के साथ कोई तुलना पैदावार NULL। इस पर काबू पाने के लिए, तीन ऑपरेटरों देखते हैं आप का उपयोग कर सकते हैं:

  • x IS NULL - निर्धारित करता है बायां हाथ अभिव्यक्ति NULL है या नहीं,
  • x IS NOT NULL - ऊपर की तरह है, लेकिन विपरीत,
  • x <=> y - समानता के लिए दोनों ऑपरेंड तुलना एक सुरक्षित तरीके से, यानी NULL को सामान्य मान के रूप में देखा जाता है।

अपने कोड के लिए, आप तीसरा विकल्प के उपयोग पर विचार और अशक्त सुरक्षित तुलना साथ जाने के लिए चाहते हो सकता है:

SELECT * FROM mycompare 
WHERE NOT(name <=> fname OR name <=> mname OR name <=> lname) 
+0

और जानकारी: [MySQL तुलना कार्य और ऑपरेटरों] (http: //dev.mysql। com/doc/RefMan/5.7/en/तुलना-operators.html) – IvanRF

2

NULL मूल्यों को स्वचालित रूप से छोड़ा जाता है यदि आप मूल्य तुलना करते हैं (क्योंकि NULL कोई मान नहीं है)। आपके where खंड का मूल रूप से अर्थ है: उल्लिखित फ़ील्ड के मानों की तुलना करें, यदि उनके पास -otherwise false है।

यदि आप उन पंक्तियों को भी चाहते हैं तो आपको NULL के लिए एक अलग चेक शामिल करना होगा।

1

आप शायद की तरह निम्नलिखित कुछ के साथ दूर हो सकता है ('' करने के लिए कि मानचित्रण शून्य संभालने एक समस्या नहीं है):

SELECT * FROM mycompare 
WHERE (ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 

select * from mycompare 
where !(ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 
3

मैं एक ही समस्या थी जब मैं अद्यतन चलाता लिख ​​रहा था और भाग पर अमल करना चाहता था कोड के केवल तभी जब दो मान अलगIS NULL और XOR का उपयोग करते हुए काम में आया था:

SELECT 1!=1;       -- 0 
SELECT 1!=2;       -- 1 
SELECT 1!=NULL;      -- NULL 
SELECT NULL!=NULL;     -- NULL 
SELECT NULL IS NULL XOR 1 IS NULL; -- 1 
SELECT NULL IS NULL XOR NULL IS NULL; -- 0 
SELECT 1 IS NULL XOR 1 IS NULL;  -- 0 

तो मैं का उपयोग कर समाप्त हो गया है:

IF (OLD.col != NEW.col) OR ((OLD.col IS NULL) XOR (NEW.col IS NULL)) THEN ... 
संबंधित मुद्दे