2015-11-08 6 views
6

मैंने यह प्रश्नोत्तरी http://www.sql-ex.ru/ पर किया है, प्रश्न 35 सटीक होने के लिए।टी-एसक्यूएल, संख्यात्मक मान

प्रश्न इस प्रकार है: उत्पाद तालिका में, उन मॉडलों को निर्धारित करें जिनमें केवल अंक या केवल लैटिन अक्षरों (ए-जेड, केस असंवेदनशील) शामिल हैं। परिणाम सेट: मॉडल, मॉडल का प्रकार।

और मैं सही जवाब है जो दिया:

SELECT model, 
     type 
FROM Product 
WHERE Model NOT LIKE '%[^A-Z]%' 
     OR Model NOT LIKE '%[^0-9]%' 

अब मेरे सवाल का कारण है कि मैं डबल negations यह काम करने की आवश्यकता है है। अगर मैं करने के लिए कोड को फिर से लिखने:

SELECT model, 
     type 
FROM Product 
WHERE Model LIKE '%[A-Z]%' 
     OR Model LIKE '%[0-9]%' 

मैं गलत जवाब मिलता है: आपकी क्वेरी पहले (उपलब्ध) डेटाबेस पर सही डाटासेट लौट आए, लेकिन यह दूसरी जाँच डेटाबेस पर गलत डाटासेट लौट आए। * रिकॉर्ड्स की गलत संख्या (37 से अधिक)

कोड का पहला उदाहरण सही जवाब देता है जबकि दूसरा उदाहरण नहीं है?

मैंने उत्तर खोजने की कोशिश की है लेकिन कोई भाग्य नहीं है। एक स्पष्टीकरण के लिए आभारी।

उत्तर

6
Where Model LIKE '%[A-Z]%' Or Model LIKE '%[0-9]%' 

पंक्तियों जहां Model कम से कम एक अल्फा न्यूमेरिक वर्ण से मेल खाता है।

यह मिश्रित अल्फान्यूमेरिक और गैर-अल्फान्यूमेरिक वर्णों वाले किसी भी तरीके से बाहर नहीं है।

उदा। उन तार जो किसी भी गैर पत्र शामिल नहीं है (यानी केवल अक्षर से मिलकर बनता है या खाली हैं)

  • : ~A#- इसके अलावा अपने सही क्वेरी या तो

    • '%[^A-Z]%' से मेल खाता है A

      की मौजूदगी के कारण से होकर गुजरेगा '%[^0-9]%': वे स्ट्रिंग जिनमें कोई गैर अंक नहीं है (यानी केवल अंक शामिल हैं या खाली हैं)।

    यह आपके दूसरे प्रयास में बिल्कुल नहीं संभाला जाता है और अक्षरों और अंकों की मिश्रित स्ट्रिंग को स्वीकार किया जाएगा।

    मैं अपने पहले ही प्रयास का प्रयोग करेंगे, लेकिन आप इस्तेमाल कर सकते हैं अगर आप डबल नकारात्मक से बचने के लिए निर्धारित किया गया है

    SELECT model 
    FROM Product 
    WHERE Model LIKE REPLICATE('[A-Z]', LEN(Model)) 
         OR Model LIKE REPLICATE('[0-9]', LEN(Model)) 
    
  • +0

    ठीक मार्टिन, आप अपने जवाब के लिए बहुत बहुत धन्यवाद – user3197410

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