কীভাবে একটি দর্শন কলামটি নূন্যতম করবেন


85

আমি এমন একটি দৃশ্য তৈরি করার চেষ্টা করছি যেখানে আমি চাই একটি কলামটি কেবল সত্য বা মিথ্যা হোক। যাইহোক, দেখে মনে হচ্ছে আমি যাই করুক না কেন, এসকিউএল সার্ভার (২০০৮) বিশ্বাস করে আমার বিট কলামটি কোনওভাবে নালার হতে পারে।

আমার কাছে "পণ্য" নামে একটি টেবিল রয়েছে যার সাথে কলাম "স্থিতি" রয়েছে INT, NULL। একটি দৃশ্যে, আমি প্রোডাক্টের প্রতিটি সারির জন্য একটি সারি ফিরিয়ে আনতে চাই, যদি বিআইটি কলামটি প্রযোজ্য হয় তবে Product.Status কলামটি 3 এর সমান হয়, অন্যথায় বিট ক্ষেত্রটি মিথ্যা হওয়া উচিত।

উদাহরণ এসকিউএল

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

যদি আমি এই ক্যোয়ারিকে ভিউ হিসাবে সংরক্ষণ করি এবং অবজেক্ট এক্সপ্লোরারে কলামগুলি দেখি, কলামটি হাসস্ট্যাটাস সেট করা আছে BIT, NULL। তবে এটি কখনই শূন্য হওয়া উচিত নয়। এই কলামটি জোর করতে আমি কি কিছু যাদু এসকিউএল ট্রিক ব্যবহার করতে পারি NOT NULL

লক্ষ্য করুন যে, আমি যদি CAST()চারপাশে সরিয়ে ফেলি CASE, কলামটি সঠিকভাবে সেট করা আছে NOT NULLতবে কলামটির ধরণ সেট করা আছে INTযা আমি চাই না। আমি এটা হতে চাই BIT। :-)

উত্তর:


152

আপনার ক্যোয়ারিকে কিছুটা পুনরায় সাজিয়ে আপনি যা চান তা অর্জন করতে পারেন। কৌশলটি হ'ল ISNULLএসকিউএল সার্ভার বুঝতে পারার আগে যে বাহ্যিক অবস্থানে থাকা উচিত ফলাফল ফলাফলটি কখনই হতে পারে না NULL

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

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


@ গন্ডার: কোনও উদ্বেগ নেই, এটি আসলে কিছুটা আরকেন। কোনও টেবিলে গণনা করা বিট কলাম তৈরি করার সময় এবং ফলাফলটি nallable না হওয়ার জন্য এটি ব্যবহার করাও সহজ।
ডি'আরসি রিতিচ

8
আমার অনুরূপ কিছু দরকার ছিল এবং আমি খুঁজে পেয়েছি যা কার্যকর COALESCE()হয়নি, আপনাকে আসলে ব্যবহার করতে হবেISNULL()
Evilobi22

@ এভিলোবিজ 22 এটি অদ্ভুত, কারণ COALESCE এবং ISNULL উভয়ই NULL ফিরিয়ে দিতে পারে। আমি অনুমান করি একটি সংকলক কৌতুক।
ডি'আরসি রিটিচ

4
এটি এক হাজার কোটি গুণ, যখন কোনও ব্যক্তিকে সাধারণত অনুমান করা হয় না তখন কী কী অনুমান করার জন্য এনটিটি ফ্রেমওয়ার্ক পাওয়ার জন্য।
এরিক


3

এফওয়াইআই, এই বার্তায় আগত লোকদের জন্য, কাস্ট / কনভার্টের বাইরের চারপাশে আইএসএনএলএল () যুক্ত করা আপনার দৃষ্টিভঙ্গিতে অপ্টিমাইজারকে গোলমাল করতে পারে।

আমাদের কাছে 2 টি টেবিল ছিল একটি সূচক কী হিসাবে একই মানটি ব্যবহার করে তবে বিভিন্ন সংখ্যার যথার্থতার সাথে (খারাপ, আমি জানি) এবং চূড়ান্ত ফলাফল তৈরি করতে আমাদের দৃষ্টিভঙ্গি তাদের সাথে যোগ দিচ্ছিল। তবে আমাদের মিডলওয়্যার কোডটি একটি নির্দিষ্ট ডেটা প্রকারের সন্ধান করছিল, এবং এই কলামটি ফিরে দেওয়া কলামের চারপাশে একটি কনভার্ট () ছিল

আমি লক্ষ্য করেছি, ওপি যেমন করেছিলাম, দেখুন ফলাফলের কলাম বর্ণনাকারীরা এটিকে নলাবদ্ধ হিসাবে সংজ্ঞায়িত করেছে এবং আমি ভাবছিলাম এটি 2 টেবিলের একটি প্রাথমিক / বিদেশী কী; আমরা কেন ফলাফলকে naclable হিসাবে সংজ্ঞায়িত করতে চাই?

আমি এই পোস্টটি পেয়েছি, কলামটি এবং ভয়েলা জুড়ে আইএসএনএলএল () ছুঁড়েছি - এখন আর কম নয়।

সমস্যাটি ছিল দর্শনের কর্মক্ষমতাটি সরাসরি টয়লেটে নেমে গেলে query কলামে কোনও ক্যোয়ারী ফিল্টার করা হয়।

কোনও কারণে, ভিউয়ের ফলাফল কলামে একটি স্পষ্ট ধারণা () অপ্টিমাইজারটিকে স্ক্রু দেয় না (এটি বিভিন্ন ধরণের নির্ভুলতার কারণে এটি করতে হবে) তবে একটি অপ্রয়োজনীয় আইএসএনএলএল () মোড়কে যুক্ত করে, একটি বড় আকারে উপায়


CONVERT()দয়া করে কীভাবে কোনও উদাহরণ সহ অ-শূন্যতা নিশ্চিত / ইঙ্গিত করবেন তার সমাধান আপনি দেখাতে পারেন ?
বা ম্যাপার

4
হাই ও - দুঃখিত আমি কিছুক্ষণের জন্য এটি দেখিনি। এখানে একটি উদাহরণ। আপনার যদি কনভার্ট (বিট, ইউআরটিআরআইডি) থাকে, তবে আপনার মতামত অনুসারে অবসরপ্রাপ্ত হয়ে বাইট বা কোনও ইনট কলামটি কিছুটা / বিলে রূপান্তরিত করে, তবে এটি আক্রান্ত হয়। অবসরপ্রাপ্ত এএসএনএলএল (কনভার্ট (বিআইটি, ইউআরআইআরইডিআরডিড), 0) এর সাথে প্রতিস্থাপন করে আপনি সেই দর্শনটি নিজের দৃষ্টিতে অ-পরিবর্তনযোগ্য করতে পারেন। যদি ইউ.আর.টি.আর.আর.ডি.টি শুরু করা শূন্য না হয়, তবে এটি কার্যকরীভাবে ভিউতে কলাম ব্যতীত কোনও কিছুই পরিবর্তন করে না। সতর্কতা: ISNULL () কোয়েরি অপ্টিমাইজেশান এবং সূচকগুলির পছন্দে হস্তক্ষেপ করতে পারে।
ব্যবহারকারী 1664043

-3

একটি নির্বাচনী বিবৃতিতে আপনি যা করতে পারেন তা হ'ল ডেটাবেস ইঞ্জিন আপনাকে ক্লায়েন্ট হিসাবে প্রেরণ করে এমন ডেটা নিয়ন্ত্রণ করে। অন্তর্নিহিত সারণীর কাঠামোর উপরে বাছাই বিবৃতিটির কোনও প্রভাব নেই। টেবিলের কাঠামোটি সংশোধন করতে আপনাকে একটি পরিবর্তিত টেবিলের বিবৃতি কার্যকর করতে হবে।

  1. প্রথমে নিশ্চিত হয়ে নিন যে টেবিলের বিট ক্ষেত্রে বর্তমানে কোনও নাল নেই
  2. তারপরে নিম্নলিখিত ddl বিবৃতিটি কার্যকর করুন: Alter Table dbo.Product Alter column status bit not null

যদি ওটোহ, আপনি যা করতে চেষ্টা করছেন তা হ'ল আউটপুট নিয়ন্ত্রণ করা, তবে আপনি যা করছেন তা যথেষ্ট। আপনার সিনট্যাক্সটি গ্যারান্টি দেয় যে ভিউ রেজাল্টসেটে হাসস্ট্যাটাস কলামের আউটপুট আসলে কখনই নালার হবে না । এটি সর্বদা বিট মান = 1 বা বিট মান = 0 হবে the


6
আমি টেবিলের কলামটি পরিবর্তন করতে চাই না। কলামটি একটি পূর্ণসংখ্যা কলাম হিসাবে সংজ্ঞায়িত করা হয়েছে, যা শূন্য করে। এটি আমাদের অনুমানের সাথে খাপ খায়। তবে আমার এমন ভিউ দরকার যা কিছুটা ক্ষেত্র সহ একটি কলাম রিটার্ন করে, এটি শূন্য হতে পারে না। এটি পর্যাপ্ত নয় যে আমি জানি এটি শূন্য হতে পারে না, কলামটি নাল নয়, যাতে এটি আমাদের ওআরএম এ সঠিকভাবে মানচিত্র করে।
রেনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.