এসকিউএল সার্ভার এক্সএমএল ডেটাটাইপটিতে একটি লাইক স্টেটমেন্ট ব্যবহার করুন


89

আপনার যদি একটি ভারচার ক্ষেত্র রয়েছে তবে আপনি সহজেই SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'দেখতে পারেন যে কলামটিতে একটি নির্দিষ্ট স্ট্রিং রয়েছে কিনা।

এক্সএমএল টাইপের জন্য আপনি কীভাবে এটি করেন?

আমার নিম্নলিখিতটি রয়েছে যা কেবলমাত্র সারিগুলিতে ফিরে আসে যেখানে একটি 'পাঠ্য' নোড রয়েছে তবে আমাকে সেই নোডের মধ্যে অনুসন্ধান করা দরকার

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 এর একটি নির্দিষ্ট অংশকে একটি গণিত ক্ষেত্রের মধ্যে "এক্সট্রাক্ট" করতে চান, এটি চালিয়ে যেতে পারেন এবং তারপরে আপনি খুব দক্ষতার সাথে এটি অনুসন্ধান করতে পারেন (হেক: আপনি সেই ক্ষেত্রটিও আইএনডিএক্স করতে পারেন!)।

মার্ক


4
আমি মূলত একটি অনুসন্ধান বৈশিষ্ট্য প্রয়োগ করছি তাই আমি কেবলমাত্র 'টেক্সট' নোডগুলিতে এক্সএমএল কলামটি অনুসন্ধান করতে চাই এবং তারপরে একটি স্ট্রিং ফিরিয়ে আনতে চাই যে অনুসন্ধানটি কোনও মিল খুঁজে পেয়েছে। উদাহরণস্বরূপ পুরো হাই এক্সএমএল কলামটি ফেরার পরিবর্তে 'হাই সেখানে' অনুসন্ধান করুন আমি কেবল একটি স্ট্রিং ফিরিয়ে আনব যেমন 'চ্যাপ হাই হাই বলেছিল এবং বহন করেছিল ...'
জন

4
আমাকে 5 সেকেন্ডের মধ্যে মারবে। আরেকটি সম্ভাব্যতা হ'ল নিখরচায় পাঠ্য সন্ধানটি ব্যবহার করা বিবেচনা করা উচিত, যদি আপনার ডেটাটি কার্যকর হয় ...
রিকনজেড

10
পুরো দায়েরকৃত সন্ধান করতে: যেখানে xMLField.value ('।', 'বর্ণচর (সর্বাধিক)') '%
FOO


89

তবুও অন্য বিকল্পটি হল এক্সএমএলকে এনভারচর হিসাবে কাস্ট করা, এবং তারপরে প্রদত্ত স্ট্রিংটি অনুসন্ধান করুন যেন এক্সএমএল ভাস একটি এনভারচার ক্ষেত্র।

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

আমি এই সমাধানটি পছন্দ করি কারণ এটি পরিষ্কার, মনে রাখা সহজ, জগাখিচুড়ি করা শক্ত, এবং যেখানে এই ধারাটির অংশ হিসাবে ব্যবহার করা যেতে পারে।

সম্পাদনা: ক্লিফ যেমন উল্লেখ করেছে, আপনি ব্যবহার করতে পারেন:

... এনভারচার যদি এমন অক্ষর থাকে যা ভের্চারে রূপান্তরিত করে না


4
এটির উপর নোটো, বা নচারচর যদি এমন অক্ষর রয়েছে যা বর্ণচর্চায় রূপান্তরিত হয় না সারণী নির্বাচন করুন * কাস্টম থেকে ন্যাভারচার (সর্বাধিক) কলামটি '% টেস্ট%' পছন্দ করুন
ক্লিফ কুল্টার

[ত্রুটি] 42000 - [এসকিউএল সার্ভার] কোলেশন অসম্ভবকে লক্ষ্য করতে এক্সএমএল থেকে এক বা একাধিক অক্ষরের রূপান্তর
ডিজাজ 6666

[ত্রুটি] 22018 - [এসকিউএল সার্ভার] ডাটা টাইপ এক্সএমএল থেকে পাঠ্যে স্পষ্ট রূপান্তর অনুমোদিত নয়।
digz6666

আপনি ডিগজ 6666666666 কে কিছু ভুল করছেন বলে মনে হচ্ছে
স্কোয়াজজ ১৩

4
@ স্কোয়াজ আপনি গতবার এই উত্তরে সর্বশেষ ভোট দিয়েছেন। এই উত্তরটি সম্পাদনা না করা হলে আপনার ভোট এখন লক ইন। :)
digz6666

10

অন্য বিকল্পটি হল এক্সএমএলটিকে স্ট্রিং হিসাবে রূপান্তর করে তারপরে LIKE ব্যবহার করে স্ট্রিং হিসাবে অনুসন্ধান করা। তবে একটি গণিত কলামটি যেখানে যেখানে এই দফাটির অংশ হতে পারে না এটির মতো অন্য একটি নির্বাচনতে এটি মোড়ানো প্রয়োজন:

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

পরামর্শ দিন এটি আপনার জায়গায় থাকতে পারে এমন কোনও নির্বাচনী এক্সএমএল সূচককে বাইপাস করতে পারে এবং পারফরম্যান্সের উপর চাপ দিতে পারে।
রুডি হিনোজোসা

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

যেখানে অনুসন্ধানের মানদণ্ড বিদ্যমান সেখানে অনুসন্ধানের জন্য একটি স্ট্রিং ফেরত দিন


কোনওভাবে ইঞ্জেকশন আটকাতে আমার কি পরামিতি দরকার?
জন

4
সচেতন থাকুন: সেই এক্সএমএল ফাংশনটি কেস-সংবেদনশীল - ডেটা.ভ্যালু কাজ করবে না ! এটি দরকার
মূল্য
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.