যেখানে এসকিউএল সার্ভারের "পাঠ্য" ডেটা প্রকারের অনুচ্ছেদ


91

যেখানে [ক্যাসলটাইপ] এসকিউএল সার্ভারে ডেটা টাইপ "পাঠ্য" হিসাবে সেট করা আছে এবং ক্যোয়ারীটি হ'ল:

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

আমি ত্রুটি পেয়েছি:

ডেটা টাইপস টেক্সট এবং ভ্রচারের অপারেটরের সমান পরিমাণে বেমানান।

আমি কোথায় এই বিভাগের তথ্যের সাথে কোথাও জিজ্ঞাসা করতে পারি না?


9
এর VARCHAR(MAX)পরিবর্তে ব্যবহার করুন TEXT- সেই ডেটাটাইপটি
হ্রাস

উত্তর:


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কলাম যুক্ত করতে পারেন যা এই ধরণের ক্যোয়ারী আপকে গতিতে ব্যবহার করতে পারে।


22

এটি চেষ্টা করুন

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

আপনি এসকিএল সার্ভারের জন্য টোডের মতো কিছু সরঞ্জাম ব্যবহার করছেন যা বিএলওবি টাইপ ক্ষেত্রগুলিকে প্রথম নির্বাহের সময় দেখা যায় তা রক্ষা করতে যদি টেক্সট ক্ষেত্রে সরাসরি ডেটা দেখতে সক্ষম হয় তবে এটি দরকারী। আপনি ক্ষেত্রটি দেখানোর জন্য টডকে বলার জন্য সর্বদা ফিল্ডে ক্লিক করতে পারেন তবে এটি দুটি ধাপের পদ্ধতি।
রজার

নোট করুন যে এটি সম্ভবত আপনার ক্যোয়ারিকে অ-সরগযোগ্য করতে সক্ষম করবে
হেইনজি

13

আপনি অপারেটরের textসাথে তুলনা করতে পারবেন না =, তবে পরিবর্তে এখানে তালিকাভুক্ত তুলনা ফাংশনগুলির একটি ব্যবহার করতে হবে । পৃষ্ঠার শীর্ষে থাকা বৃহত সতর্কতা বাক্সটিও নোট করুন, এটি গুরুত্বপূর্ণ।


5

আপনি যদি ভার্চর (সর্বাধিক) ব্যবহার করতে টেবিলের নিজেই ডেটাটাইপটি পরিবর্তন করতে না পারেন তবে আপনার ক্যোয়ারীটি এতে পরিবর্তন করুন:

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% নিশ্চিত নই।
মার্টিন স্মিথ

@ মার্টিন: যেহেতু আপনি কোনও পাঠ্য কলামটি সূচী করতে পারবেন না, তাই আমি মনে করি আপনি উভয় ক্ষেত্রেই একটি পূর্ণ টেবিল স্ক্যান শেষ করবেন।
জো স্টেফেনেলি

আমি সম্মত তবে এটি পুনরায় ফিরে আসা সারিগুলির একটি অনুমান পেতে কলামে পরিসংখ্যানগুলি ব্যবহার করবে যা যোগদানের সিদ্ধান্তগুলিতে প্রভাব ফেলবে ইত্যাদি
মার্টিন স্মিথ

0

এটি এমএসএসকিউএল এবং মাইএসকিউএলে কাজ করে:

SELECT *
FROM   Village
WHERE  CastleType LIKE '%foo%'; 

4
ওপি এমএসএসকিউএল নয় মাইএসকিউএল ব্যবহার করছে।
ডেকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.