কেন এসকিউএল এর বিটওয়াইন অর্ধ-খোলা চেয়ে অন্তর্ভুক্ত?


45

সেমি-ওপেন (বা হাফ-ওপেন, হাফ-ক্লোজড , হাফ-বাউন্ডেড ) অন্তরগুলি ( [a,b)যেখানে xইন্টারভাল iff এর অন্তর্গত a <= x < b) প্রোগ্রামিংয়ে বেশ সাধারণ, কারণ তাদের অনেক সুবিধাজনক বৈশিষ্ট্য রয়েছে।

যে কেউ এসকিউএল এর BETWEENএকটি বদ্ধ বিরতি ( [a,b]) ব্যবহার করে তা ব্যাখ্যা করে এমন যুক্তি সরবরাহ করতে পারে ? এটি esp হয়। তারিখগুলির জন্য অসুবিধাজনক। তুমি কেন এমন BETWEENআচরণ করবে ?


আমি কৌতুহলী, তাদের কি সুবিধাজনক সম্পত্তি আছে?
ফ্যান্ট0 মি

2
যদি এটি অন্তর্ভুক্ত না হয় আপনি কীভাবে সহজেই A থেকে D পরিসরে সমস্ত শেষ নামগুলির জন্য প্রশ্ন করতে পারেন? বা ডাব্লু টু জেড এর নাম? 1 এবং 10 এর মধ্যে সংখ্যার জন্য আপনি 0 <n <11 অনুসন্ধান করতে পারেন তবে অক্ষরের জন্য আপনাকে ASCII নম্বর ব্যবহার করতে হবে? না ইউনিকোড নম্বর? এছাড়াও, সূচীগুলি সহজেই আপনাকে আপনার ডেটা শুরুর দিকে নিয়ে যেতে পারে।
jqa

2
আমি আপনার হতাশা বুঝতে পেরেছি, (স্টার্ট ডেট> = '2010-01-01' এবং স্টার্ট ডেট <'2011-01-01') সুন্দর কাজ করে, সমতুল্যদের মধ্যে ব্যবহার করা ('2010-01-01' এর মধ্যে স্টার্ট ডেট হবে) 2010-12-31 23:59:59 '), বিশাল এবং উভয়ই ডিসেম্বরে কত দিন আছে তা জানতে হবে
টড

1
@ ফ্যান্ট0 মি [এ, বি) ইউ [সি, ডি) == [ক, ডি)। [a: int, b: int) এ হ'ল বা উপাদান রয়েছে। টডের মন্তব্যগুলি দেখায় যে তারা কীভাবে খেজুরগুলির জন্য বিশেষভাবে ভাল কাজ করে (যা ছিল আমি তাদের সবচেয়ে বেশি মিস করি)। মূলত, কোডিং করার সময়, সেমোপেন অন্তরগুলি সহজ, ব্যবহার করা সহজ এবং দৃust় হয়।
অ্যালেক্স

সেরা উত্তরের ক্ষেত্রে SQL এর জন্য প্রথমে BETWEEN নির্দিষ্ট করা লোকেদের উদ্দেশ্যমূলক সিদ্ধান্তের নথীকরণগুলি উল্লেখ করা উচিত, এরপরে কেন তার উত্তর দেওয়া উচিত বিষয়টির উত্তর বাছাই না করে।
টড

উত্তর:


48

আমি মনে করি অন্তর্ভুক্তিটি BETWEENএকটি অর্ধ-খোলা ব্যবধানের চেয়ে আরও স্বজ্ঞাত (এবং স্পষ্টতই, এসকিউএল ডিজাইনাররাও করেছিলেন)। উদাহরণস্বরূপ, যদি আমি "1 এবং 10 এর মধ্যে একটি সংখ্যা বাছাই করুন" বলি, তবে বেশিরভাগ লোকেরা 1 এবং 10 নম্বর অন্তর্ভুক্ত করবে open এসকিউএল মাঝেমধ্যে অ প্রোগ্রামারদের দ্বারা ব্যবহৃত হয় সহজ প্রশ্নের করা, ও আধা খোলা শব্দার্থবিদ্যা হতো অনেক বেশি তাদের জন্য বিভ্রান্তিকর।


9
আপনার উদাহরণটি দশমিক সংখ্যা এবং অন্যান্য সীমিত পরিমাণের জন্য (যেমন তারিখগুলি) পূর্ণসংখ্যার উপর দৃষ্টি নিবদ্ধ করে, এর মধ্যে শব্দটি অস্পষ্ট। যদি আমি বলি যে আপনি 2012 এবং 2013 এর মধ্যে এক্স করেছেন, তবে আমি 2013 (বা বিশেষ করে দিনটি 2013-01-01) অন্তর্ভুক্ত করব না
টড

4
@ টড এই পদগুলির কোনও ব্যবহারই অস্পষ্ট। এ কারণেই গণিতবিদ, বিজ্ঞানী এবং জ্ঞানবিদ প্রোগ্রামাররা তাদের উদ্দেশ্যটিকে "অর্ধ-খোলা" বা এ জাতীয় হিসাবে নথিভুক্ত করেন। আমি মনে করি ওলেস্কির উত্তরের মূল বক্তব্য হ'ল এসকিউএল মূলত প্রোগ্রামারদের পরিবর্তে শেষ-ব্যবহারকারীদের জন্য তৈরি করা হয়েছিল (সত্যই!)। স্পষ্টতই এসকিউএল ডিজাইনাররা এমন একটি সংজ্ঞায় ছুরিকাঘাত করেছিলেন যা তারা দর্শকদের পক্ষে সবচেয়ে ভাল বলে মনে করেছিল। তবে প্রশ্নের লেখকরা যেমন পরামর্শ দিয়ে থাকেন, আধাসুধা সময়সীমার মতো পরিসীমা নিয়ে কাজ করার জন্য প্রায় সবসময়ই ভাল।
তুলসী বাউরক

"আমি মনে করি অন্তর্ভুক্ত BETWEEN আরও স্বজ্ঞাত" বিষয়গত হয়। "এসকিউএল মাঝে মাঝে নন-প্রোগ্রামাররা সাধারণ জিজ্ঞাসা তৈরি করতে ব্যবহৃত হয়" - নন-প্রোগ্রামারদের সমানভাবে চেকটি পরীক্ষা করা প্রয়োজন।
টড


প্রশ্নটি প্রায়শই " 1 থেকে 10 পর্যন্ত একটি সংখ্যা বাছাই করুন " (কেবল সুস্পষ্ট অস্পষ্টতা এড়াতে) জিজ্ঞাসা করা হয়। পার্শ্ব নোট হিসাবে। আপনি বলছেন "1 থেকে 10 এর মধ্যে একটি সংখ্যা বাছাই করুন"; বেশিরভাগ লোকেরা সম্ভবত 1 বা 10 টি পছন্দ করবেন না এটি অনুমোদিত যে এটি একটি মনোবিজ্ঞানের সমস্যা issue :) লোকেরা এখনও 1 এবং 10 টি বৈধ পছন্দ হিসাবে গ্রহণ করবে (শব্দার্থগতভাবে ভুল হওয়া সত্ত্বেও); তবে এটি 1 এবং 10 টি বৈধ বলে ধরে নিলে প্রাসঙ্গিক ব্যাখ্যার ফলাফল । যদি আপনি বলতেন: "13 থেকে 24 এর মধ্যে" এবং আপনাকে 13 এবং 24 অন্তর্ভুক্ত রয়েছে কিনা জিজ্ঞাসা করার সম্ভাবনা বেশি।
বিভ্রান্তি

25

প্রশ্ন: এসকিউএল এর বিটওয়াইন কেন অন্তর্ভুক্ত?

উত্তর: এসকিউএল ভাষা ডিজাইনাররা একটি দুর্বল নকশার সিদ্ধান্ত নিয়েছে, যাতে তারা সিনট্যাক্স সরবরাহ করতে ব্যর্থ হয়েছে যা বেটউইভেনের 4 টি রূপগুলির (বদ্ধ, অর্ধ-খোলা-বাম, আধ-খোলা-ডান, বা খোলার জন্য) বিকাশকারীদের নির্দিষ্ট করতে সক্ষম করবে ) তারা পছন্দ করবে।

প্রস্তাবনা: এসকিউএল স্ট্যান্ডার্ড সংশোধন না করা অবধি / তারিখ / বারের জন্য বিটউইইন ব্যবহার করবেন না। পরিবর্তে আপনার BETWEEN রেঞ্জের শুরু এবং শেষ সীমানায় স্বাধীন শর্ত হিসাবে DATE রেঞ্জের তুলনা কোডিংয়ের অভ্যাসে প্রবেশ করুন। এটি কিছুটা ভার্বোজ, তবে আপনাকে এমন শর্ত লিখতে দেবে যা স্বজ্ঞাত (যেভাবে বগি হওয়ার সম্ভাবনা কম) এবং ডাটাবেস অপ্টিমাইজারের কাছে পরিষ্কার হয়ে যায়, সর্বোচ্চ কার্যকর প্রয়োগের পরিকল্পনা নির্ধারণ করার জন্য এবং সূচকগুলি ব্যবহার করার অনুমতি দেয়।

উদাহরণস্বরূপ, যদি আপনার ক্যোয়ারী কোনও ইনপুট দিনের স্পেসিফিকেশন গ্রহণ করে এবং সেই তারিখে পড়েছে এমন সমস্ত রেকর্ড ফিরিয়ে দিতে পারে, আপনি কোডটি লিখবেন:

  • WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1

BETWEEN ঝুঁকিপূর্ণ পারফরম্যান্স সমস্যা এবং / অথবা বগি কোড ব্যবহার করে যুক্তি লেখার চেষ্টা করছেন। তিনটি সাধারণ মিসটপস:

1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1

এটি প্রায় অবশ্যই একটি বাগ - ব্যবহারকারী নির্দিষ্ট তারিখের জন্য কেবল রেকর্ডগুলি দেখতে প্রত্যাশা করে, তবুও একদিন পরের দিন সকাল 12 টা থেকে রেকর্ড সম্বলিত একটি প্রতিবেদনটি সরিয়ে ফেলবে।

2) WHERE TRUNC(DATE_FIELD) = :dt

সঠিক উত্তর দেয়, তবে DATE_FIELD এ ফাংশনটি প্রয়োগ করা সর্বাধিক সূচী / পরিসংখ্যানকে অকেজো হিসাবে উপস্থাপন করে (যদিও কখনও কখনও ডিবিএগুলি ফাংশন-ভিত্তিক সূচীগুলি তারিখের ক্ষেত্রগুলিতে যোগ করার চেষ্টা করবে - এখনও মান-ঘন্টা এবং ডিস্ক স্পেস জ্বালিয়ে এবং আইইউডিতে ওভারহেড যোগ করে টেবিলে অপারেশন)

3) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60

টম কিট, ওরাকল গুরু অসাধারণ, এই-কম-মার্জিত (আইএমও) সমাধানের পরামর্শ দিয়েছেন। আপনি "1-1 / 24/06/60" সন্ধানের জন্য "1-1 / 24/06/60" না পাওয়া অবধি দুর্দান্ত কাজ করে যা অসম্পূর্ণ ফলাফল দেয় ... বা আপনি দুর্ঘটনাক্রমে একটি টাইমস্ট্যাম্প ক্ষেত্রে ব্যবহার না করা অবধি। এছাড়াও, এটি কিছুটা মালিকানাধীন; ওরাকল এর তারিখের ডেটা টাইপের সাথে সামঞ্জস্যপূর্ণ (যা দ্বিতীয়টিতে ট্র্যাক করে) তবে বিভিন্ন ডেটাবেস পণ্যগুলির তারিখ / TIME যথার্থতার সাথে সামঞ্জস্য করা দরকার।

সমাধান: ক্লোজড / ইনক্লুসিভ ডিফল্ট বিকল্পগুলির বিশদকরণ সমর্থন করার জন্য বিটউইউন সিনট্যাক্সটি সংশোধন করে এসকিউএল ল্যাঙ্গুয়েজ স্পেসকে বাড়ানোর জন্য এএনএসআই এসকিউএল কমিটির কাছে আবেদন করুন committee এরকম কিছু কৌশলটি করবে:

expr1 এর মধ্যে বিগত 2 এক্সপ্রেস [ অন্তর্ভুক্ত [ব্যবহার করুন] | EXCL [USIVE]] এবং expr3 [ INCL [USIVE] | EXCL [ব্যবহার করা]]

প্রকাশ করা কত সহজ হয়ে যায় তা বিবেচনা করুন WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE(বা ন্যায়সঙ্গত WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL)

হতে পারে এএনএসআই এসকিউএল: 2015?


এই উত্তর ageষি পরামর্শ।
তুলিল বাউরক

@ কেভিনকির্কপ্যাট্রিক - দুর্দান্ত উত্তর! আমি প্রস্তাব দিচ্ছি যে আপনি সিদ্ধান্তের ডকুমেন্টেশনগুলি কেন মূল কারণটির প্রমাণীকরণ হিসাবে অনুসন্ধান করার চেষ্টা করবেন।
টড

3
আমি ব্যক্তিগতভাবে সেইরকমটি পছন্দ exp1 BETWEEN exp2 AND exp3 AND exp1 != exp3করি যাতে আপনি অপারেটরটির মধ্যে রাখতে পারেন যাতে আপনি জানেন যে এটি একটি বিস্তৃত শিকারী, এবং অসমতার পূর্বাভাস নিশ্চিত করে যে এটি আধমুক্ত।
সেন্টিনেল

@ সেন্টিনেল, সুন্দর! আমি অকাল থেকে নিজেকে রূপান্তরিত করতে যাচ্ছি না, তবে আমি পরবর্তী কোডের তারিখ-সীমার শর্তগুলির জন্য অবশ্যই এই রূপটি মনে রাখব। প্রথম ব্লাশে, এটির এক্সপ 1> = Exp2 এবং Exp1 <Exp3 এর চেয়ে বৃহত্তর ভাষাগত আবেদন রয়েছে; এবং স্পষ্টতই BETWEEN এর সাথে সমানভাবে ভাল সমস্যার সমাধান করে। আমি আগ্রহী যদি কোনও অপ্টিমাইজারগুলি অন্যটির তুলনায় একটি ভিন্নতার আরও "বোঝাপড়া" দেখায়; অবশ্যই, এটি প্রশংসনীয় বলে মনে হচ্ছে যে
আপনারও

@ কেভিনকিরকপ্যাট্রিক কোন মতপার্থক্য আছে কিনা তা জানার জন্য আমি কখনই তাদের প্রোফাইল করিনি, এবং আমিও যদি সেখানে থাকি তবে হতাশ হয়ে যেতাম।
সেন্টিনেল

8

ইনক্লুসিভ ( a <= x <= b) এবং এক্সক্লুসিভ ( a < x < b) উভয়ই সমানভাবে সাধারণ, সুতরাং মানগুলি তৈরি করার সময় তাদের কেবল একটি বাছাই করতে হয়েছিল। প্রচলিত ইংরেজিতে "এর মধ্যে" সাধারণত অন্তর্ভুক্ত থাকে এবং একটি এসকিউএল স্টেটমেন্ট বলতে বোঝায় কোনও ইংরেজি বাক্যটির অনুরূপ পড়া, সুতরাং অন্তর্ভুক্তিটি একটি বোধগম্য পছন্দ ছিল।


4
আপনি হাফ-ওপেন ছেড়ে যাওয়ার সাথে সাথে ইংরেজিতে ব্যবহার আরও মেশানো। যখন আমরা বলি "দুপুরের খাবার দুপুর 1 টায় মধ্যে" আমরা মানে আধ খোলা যে তুমি ক্লাসে ফিরে আশা করা যায় / 13 মুহূর্তে কাজ: 00: 00,000, BREAK দিকে যাচ্ছেন সঙ্গে কিন্তু সহ না প্রথম মুহূর্ত এক-ঘড়ির ঘন্টা a <= x < bহাফ-ওপেন
তুলসী বাউরক

1
@ বাসিলবার্ক: এটি অসীম নির্ভুলতার কারণে হতে পারে - যেমন মধ্যাহ্নভোজন দুপুর এবং 12: 59: 99.9999999999999 এর মধ্যে ....
ব্রেন্ডন

@ ব্রেন্ডন হ্যাঁ, আপনি আমার বক্তব্য রাখছেন। অসীম (বা অস্পষ্ট) নির্ভুলতা হ'ল সমস্যাগুলির মধ্যে একটি যা সময়ের ব্যবধান নির্ধারণের জন্য অর্ধ-খোলা পদ্ধতির ব্যবহার করে পরিচালনা করা হয়। এখানে মূল বক্তব্যটি হ'ল ইংরেজী কথোপকথনে আমরা স্বজ্ঞাতভাবে খোলা এবং বন্ধ (এই উত্তরে উল্লিখিত) পাশাপাশি অনেক চিন্তাভাবনা ছাড়াই অর্ধ-খোলা রেঞ্জগুলি পরিচালনা করি। প্রতিটি পদ্ধতির একটি উদ্দেশ্য পরিবেশন করা হয়। এজন্যই বিটিউইউনের এসকিউএল সংজ্ঞাটি সর্বোত্তমের চেয়ে কম। আদর্শভাবে, এসকিউএল কেভিনকিরকপ্যাট্রিকের পরামর্শ অনুসরণ করবে ।
তুলিল বাউরক

2
এসকিউএলটি ইংরেজী-জাতীয় বলে মনে করা হয়, এবং যদিও সমেত এবং একচেটিয়াভাবে সমানভাবে সাধারণ হতে পারে তবে এটি বিশ্লেষক এবং প্রোগ্রামারদের জন্য একটি কোয়েরি ভাষা। একজন প্রোগ্রামার হিসাবে, আমি মনে করি এটির সংজ্ঞাটি ভুল, কিন্তু এটিতে আসলেই কিছু আসে যায় না, আমি যাইহোক "বিটওয়াইন" ব্যবহার এড়াতে চাই। তেমন কিছু না.
টড

5

অপারেটরকে ডাকা হয় না ∩[a,b), বলা হয় BETWEEN, সুতরাং এর শব্দার্থবিজ্ঞানের পক্ষে গাণিতিক প্রিকেক্টের তুলনায় "অর্ধ-উন্মুক্ত ব্যবধানের" চেয়ে " ইংলিশ " এর মধ্যবর্তী " শব্দগুচ্ছ " হওয়া উচিত, এটি যথেষ্ট উপযুক্ত ।


শুধুমাত্র পূর্ণসংখ্যা সেটগুলির জন্য ইংলিশ অ্যাপ্লিকেশনগুলি নয়, সমস্ত অ্যাপ্লিকেশন বিবেচনা করা উচিত। "1 থেকে 10 এর মধ্যে", "দুপুর এবং 1 টা" এর মধ্যে "," 1.0 থেকে 5.0 এর মধ্যে "(গ্রাম)। "5.50 থেকে 10.30" এর মধ্যে (ডলার)। অবিচ্ছিন্ন পরিমাণগুলি যৌক্তিকভাবে (ইংরাজী) একচেটিয়া বলে ধরে নেওয়া হবে।
টড

1
সমস্যাটি হ'ল BETWEENঅপারেটর ইংরেজী বাক্যাংশ "এর মধ্যে" শব্দার্থক শব্দ ব্যবহার করে না । ইংরেজিতে "মধ্যে" হ'ল সময়, স্থান বা ব্যবধান যা জিনিসকে আলাদা করে (যেমন এটি একচেটিয়া )। আপনি যদি কোনও লক্ষ্যে লাথি মারার চেষ্টা করেন, বলটি স্কোর করতে পোস্টগুলির মধ্যে যেতে হবে। আপনি যদি তাদের মধ্যে পাস করতে ব্যর্থ হয়ে পোস্টটি হিট করেন - আপনার পক্ষে কোনও স্কোর নেই।
বিভ্রান্ত

1
@ ক্রেইগ ইয়ং যেমন স্বীকৃত উত্তরের প্রস্তাব দেয় (এবং আমি সম্মত), "যদি আমি বলি" 1 এবং 10 এর মধ্যে একটি সংখ্যা চয়ন করুন ", তবে বেশিরভাগ লোকেরা 1 এবং 10 নম্বরগুলি অন্তর্ভুক্ত করবেন [তাদের উত্তরের উত্তরগুলিতে]" " একটি স্থানিক ডোমেনে আমি আপনার সাথে একমত, তবে সংখ্যার জন্য আমি বলতে চাই যে এটি আলাদা। জন্য আরো ভাল ইংরেজি ভাষা ও ব্যবহারের এখানে যদিও চেয়ে!
আকাশম

@ আকাশম আমার বক্তব্যটি হ'ল আপনি ইংরাজী ভাষা সম্পর্কে একটি দাবি করেছেন যা প্রোগ্রামিং শব্দার্থকে ন্যায্যতা জানাতে "মধ্যবর্তী" শব্দের সংজ্ঞা দিয়ে কেবল মিথ্যা। "1 এবং 10" এর মধ্যে "1" এবং "দশমিক সংখ্যা সিস্টেমের 1 এবং 10 পজিশনের অবস্থানগুলির সাথে" এর মধ্যে "এর অর্থের সাথে আরও কিছু বোঝার দরকার নেই বলে এই বাক্যটির একটি সাধারণ উপলব্ধি রয়েছে fact মানুষের মস্তিষ্কের "অটো-সঠিক" উপেক্ষা করে যে "এর মধ্যে" এই ক্ষেত্রে শেষ পয়েন্টগুলি বাদ দেয় কারণ "2 থেকে 9 পর্যন্ত" বোঝানো হাস্যকর বলে মনে হয়। "13 থেকে 24 এর মধ্যে" দিয়ে একই চেষ্টা করুন। অথবা এমনকি "0 এবং 11 এর মধ্যে"।
হতাশায়

আপনার এবং আমার মধ্যে, প্রাকৃতিক ভাষা সম্পর্কে স্পষ্টত দাবি সাধারণত অনিরাপদ।
আকাশম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.