SQL सर्वर "टेक्स्ट" डेटा प्रकार पर क्लॉज कहां है


90

जहाँ [CastleType] को SQL सर्वर में डेटा प्रकार "टेक्स्ट" के रूप में सेट किया गया है और क्वेरी है:

SELECT *
FROM   [Village]
WHERE  [CastleType] = 'foo' 

मुझे त्रुटि मिली:

ऑपरेटर के बराबर डेटा प्रकार TEXT और VARCHAR असंगत हैं।

क्या मैं इस डेटा प्रकार को WHERE क्लॉज़ के साथ क्वेरी नहीं कर सकता हूँ?


9
VARCHAR(MAX)इसके बजाय का उपयोग करें TEXT- कि डेटाटाइक पदावनत है
marc_s

जवाबों:


101

आप उपयोग कर सकते हैं LIKEके बजाय =। बिना किसी वाइल्डकार्ड के इसका प्रभाव समान होगा।

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

SELECT *
FROM   @Village
WHERE  [CastleType] LIKE 'foo' 

textपदावनत किया गया है। के varchar(max)साथ काम करना आसान हो जाएगा।

इसके अलावा डेटा कितना बड़ा होने की संभावना है? यदि आप समानता तुलना करने जा रहे हैं तो आप आदर्श रूप से इस कॉलम को अनुक्रमित करना चाहेंगे। यह संभव नहीं है यदि आप स्तंभ को 900 बाइट्स से अधिक व्यापक घोषित करते हैं, हालांकि आप इस प्रकार के क्वेरी को गति देने के लिए उपयोग किया जा सकने वाला एक संगणित checksumया hashस्तंभ जोड़ सकते हैं ।


20

कृपया यह प्रयास करें

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR, CastleType) = 'foo'

यह TEXT फ़ील्ड में डेटा को सीधे देखने में सक्षम होने के लिए भी उपयोगी है यदि आप टॉक जैसे Sql सर्वर के लिए कुछ उपकरणों का उपयोग कर रहे हैं जो पहले निष्पादन पर देखे जाने के लिए BLOB प्रकार फ़ील्ड की सुरक्षा करते हैं। फ़ील्ड को दिखाने के लिए आप हमेशा Toad को बताने के लिए फ़ील्ड पर क्लिक कर सकते हैं, लेकिन यह एक दो चरण की प्रक्रिया है।
रोजर 11

ध्यान दें कि यह संभवतः आपकी क्वेरी को गैर-सारगर्भित बना देगा
हेंजी

13

आप ऑपरेटर के textसाथ तुलना नहीं कर सकते हैं =, लेकिन इसके बजाय यहाँ सूचीबद्ध तुलना कार्यों में से एक का उपयोग करना चाहिए । पृष्ठ के शीर्ष पर स्थित बड़े चेतावनी बॉक्स पर भी ध्यान दें, यह महत्वपूर्ण है।


5

यदि आप varchar (max) का उपयोग करने के लिए स्वयं तालिका में डेटाटाइप को नहीं बदल सकते हैं, तो अपनी क्वेरी को इसमें बदलें:

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'

2

यह वह नहीं है जो त्रुटि संदेश कहता है। यह कहता है कि आप =ऑपरेटर का उपयोग नहीं कर सकते । उदाहरण के लिए प्रयास करें LIKE 'foo'


Col IN ('foo', 'bar')मूल रूप से के रूप में ही है Col = 'foo' or Col = 'bar'और एक ही समस्या होगी।
मार्टिन स्मिथ

@ मॉर्टिन: हाइलाइट के लिए धन्यवाद, मैं इसके बारे में नहीं जानता था। मैं इसे तब ठीक करूँगा।
विल मार्कॉइलर

0

एक और विकल्प होगा:

SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0

मुझे संदेह है कि like 'foo'इस दृष्टिकोण से बेहतर कार्डिनैलिटी का अनुमान हो सकता है लेकिन मैं 100% निश्चित नहीं हूं।
मार्टिन स्मिथ

@ मॉर्टिन: चूंकि आप एक टेक्स्ट कॉलम को इंडेक्स नहीं कर सकते हैं, मुझे लगता है कि आप किसी भी स्थिति में एक पूर्ण तालिका स्कैन के साथ समाप्त करेंगे।
जो स्टेफानेली

मैं सहमत हूं लेकिन यह अभी भी स्तंभों के आँकड़ों का उपयोग उन पंक्तियों का एक अनुमान प्राप्त करने के लिए करेगा जो वापस आ जाएगी जो निर्णय में शामिल हो सकती हैं आदि
मार्टिन स्मिथ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.