SQL सर्वर XML डेटाटाइप पर एक LIKE स्टेटमेंट का उपयोग करें


87

यदि आपके पास एक वर्चर फ़ील्ड है, तो आप आसानी SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'से देख सकते हैं कि क्या उस कॉलम में एक निश्चित स्ट्रिंग है।

आप XML प्रकार के लिए कैसे करते हैं?

मेरे पास निम्नलिखित हैं जो केवल उन पंक्तियों को लौटाते हैं जिनमें एक 'टेक्स्ट' नोड है, लेकिन मुझे उस नोड के भीतर खोज करने की आवश्यकता है

select * from WebPageContent where data.exist('/PageContent/Text') = 1

जवाबों:


70

आपको यह आसानी से करने में सक्षम होना चाहिए:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'

.valueविधि आप वास्तविक मूल्य देता है, और आप को परिभाषित कर सकते हैं कि एक VARCHAR (), जिसे फिर आप की तरह बयान से जांच कर सकते हैं के रूप में वापस किया जाना है।

ध्यान रहे, यह बहुत तेजी से होने वाला नहीं है। इसलिए यदि आपके XML में कुछ फ़ील्ड्स हैं जिनका आपको बहुत निरीक्षण करने की आवश्यकता है, तो आप कर सकते हैं:

  • एक संग्रहित फ़ंक्शन बनाएँ जो XML प्राप्त करता है और वह मान लौटाता है जिसे आप VARCHAR () के रूप में देख रहे हैं
  • अपनी मेज पर एक नए गणना वाले क्षेत्र को परिभाषित करें जो इस फ़ंक्शन को कॉल करता है, और इसे एक स्तंभित स्तंभ बनाता है

इसके साथ, आप मूल रूप से XML के एक निश्चित हिस्से को एक संगणित क्षेत्र में "निकाल" देंगे, इसे बनाए रखेंगे, और फिर आप इस पर बहुत कुशलता से खोज कर सकते हैं (बिल्ली: आप उस क्षेत्र को भी जोड़ सकते हैं!)।

न घुलनेवाली तलछट


1
मैं मूल रूप से एक खोज सुविधा को लागू कर रहा हूं, इसलिए मैं XML कॉलम को केवल 'टेक्स्ट' नोड्स पर खोजना चाहता हूं और फिर यह इंगित करने के लिए एक विकल्प लौटाता हूं कि खोज ने एक मैच पाया है। उदाहरण के लिए 'हाय वहाँ' पर खोज करने के बजाय पूरे xml कॉलम को वापस करने के बजाय मैं सिर्फ एक विकल्प की वापसी करूँगा जैसे कि 'chap ने कहा कि हाय और किया गया ...'
जॉन

1
मुझे 5 सेकंड से हराया। एक अन्य संभावना यह है कि यदि आपके डेटा में
सुधार हो

10
पूरे दर्ज करने के लिए खोज करें: WHERE xmlField.value ('।', 'varchar (अधिकतम)') LIKE '% FOO%'
jhilden

अगर आपको NULL वापस मिलता है तो pesky Xml नामस्थान के लिए बाहर देखें
Simon_Weaver

87

फिर भी एक अन्य विकल्प XML को nvarchar के रूप में डालना है, और फिर दिए गए स्ट्रिंग की खोज करें जैसे कि XML vas एक nvarchar फ़ील्ड।

SELECT * 
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'

मुझे यह समाधान पसंद है क्योंकि यह साफ है, याद रखना आसान है, गड़बड़ करना मुश्किल है, और जहां एक खंड के हिस्से के रूप में इस्तेमाल किया जा सकता है।

संपादित करें: जैसा कि क्लिफ इसका उल्लेख करते हैं, आप उपयोग कर सकते हैं:

... nvarchar अगर वहाँ वर्ण है कि varchar में परिवर्तित नहीं है


3
उस पर Ditto, या nvarchar अगर वहाँ वर्ण है कि varchar का चयन करने के लिए परिवर्तित नहीं है * तालिका से कहाँ कास्ट (nvarchar (अधिकतम) के रूप में स्तंभ) '% परीक्षण%' की तरह
क्लिफ कल्टर

[त्रुटि] ४२००० - [एसक्यूएल सर्वर] एक्सएमएल से एक या एक से अधिक वर्णों का रूपांतरण असंभव को टारगेट करने के लिए असंभव
digz6666 १०'१66

[एआरआर] २२०१ - - [एसक्यूएल सर्वर] डेटा टाइप एक्सएमएल से टेक्स्ट में स्पष्ट रूपांतरण की अनुमति नहीं है।
digz6666

लगता है कि आप कुछ गलत कर रहे हैं @ digz6666
स्क्वेज़

1
@Squazz आपने आखिरी बार कल इस जवाब पर मतदान किया था। जब तक यह उत्तर संपादित नहीं हो जाता, तब तक आपका वोट बंद है। :)
digz6666

10

एक अन्य विकल्प XML को स्ट्रिंग के रूप में परिवर्तित करके और फिर LIKE का उपयोग करके एक स्ट्रिंग के रूप में खोजना है। हालाँकि, एक संगणित कॉलम WHERE क्लॉज़ का हिस्सा नहीं हो सकता है, जिसे आपको इस तरह से एक और SELECT में लपेटना होगा:

SELECT * FROM
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'

यह सलाह दी जाती है कि यह आपके स्थान पर हो सकने वाले किसी भी चयनात्मक xml अनुक्रमित को दरकिनार कर सकता है और प्रदर्शन पर प्रहार कर सकता है।
रूडी हिनोजोसा

0

यह मैं marc_s उत्तर के आधार पर उपयोग करने जा रहा हूं:

SELECT 
SUBSTRING(DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999)

FROM WEBPAGECONTENT 
WHERE COALESCE(PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0

उस खोज पर एक विकल्प लौटाएँ जहाँ खोज मापदंड मौजूद है


क्या मुझे किसी तरह इंजेक्शन को रोकने के लिए मापदंडों की आवश्यकता है?
जॉन

2
सावधान: उन XML फ़ंक्शन केस-संवेदी हैं - DATA.VALUE नहीं चलेगा ! इसके लिए .value (...)
marc_s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.