কেউ দয়া করে এসকিউএলে নিম্নলিখিত আচরণ ব্যাখ্যা করতে পারেন?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
কেউ দয়া করে এসকিউএলে নিম্নলিখিত আচরণ ব্যাখ্যা করতে পারেন?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
উত্তর:
<>
স্ট্যান্ডার্ড এসকিউএল -২২; !=
এর সমতুল্য উভয়ই মূল্যবোধের জন্য মূল্যায়ন করে, যা NULL
নয় - NULL
কোনও স্থানের ধারক বলতে মানটির অভাব রয়েছে।
যে কারণে আপনি কেবল এ জাতীয় পরিস্থিতিতে পূর্বাভাস হিসাবে IS NULL
/ ব্যবহার করতে পারেন IS NOT NULL
।
এই আচরণটি এসকিউএল সার্ভারের সাথে সুনির্দিষ্ট নয়। সমস্ত মান অনুসারে এসকিউএল ডায়ালেক্ট একইভাবে কাজ করে।
দ্রষ্টব্য : আপনার মানটি শূন্য না হলে তুলনা করতে আপনি ব্যবহার করেন IS NOT NULL
, নাল মান না দিয়ে তুলনা করার জন্য আপনি ব্যবহার করেন <> 'YOUR_VALUE'
। আমার মানটি যদি নুলের সমান হয় বা না হয় তবে আমি বলতে পারি না, তবে আমি বলতে পারি যে আমার মানটি ন্যূন বা নাল নয় কিনা। আমার মান যদি NUL ব্যতীত অন্য কিছু হয় তবে আমি তুলনা করতে পারি।
!=
understand 9i অবধি সমর্থন করল না যতক্ষণ আমি বুঝতে পেরেছি, যা প্রচুর এএনএসআই -২৯ সিনট্যাক্স নিয়ে এসেছিল। আমার বিশ্বাস মাইএসকিউএল একই, একই সাথে 4.x সমর্থন শুরু করে
!=
পরবর্তী বিকল্প হিসাবে বিকল্প হিসাবে অন্তর্ভুক্ত করা হতে পারে যে প্রস্তাব সম্ভবত বলে মনে হচ্ছে <>
। নতুন চশমাগুলিতে আমার হাত নেই যাতে আমি নিশ্চিত করে বলতে পারি না।
WHERE MyColumn != NULL
বা WHERE MyColumn = NULL
নির্বিচারবাদী? বা অন্য কথায়, এটি কি সর্বদা 0 টি সারি ফেরত দেওয়ার গ্যারান্টিযুক্ত, MyColumn
ডাটাবেসে অণাময় কিনা তা বিবেচনাধীন?
!=
শুধুমাত্র মানগুলির জন্য মূল্যায়ন করে, এর মতো কিছু করা WHERE MyColumn != 'somevalue'
NULL রেকর্ডগুলি ফিরিয়ে দেয় না।
NULL এর কোনও মূল্য নেই এবং তাই স্কেলার মান অপারেটরগুলি ব্যবহার করে তুলনা করা যায় না।
অন্য কথায়, কোনও মানই কখনই NULL এর সমান (বা সমান নয়) হতে পারে না কারণ NULL এর কোনও মূল্য থাকে না।
অতএব, এসকিউএল এর একটি বিশেষ নাল রয়েছে এবং এটি নুলকে মোকাবেলার জন্য পূর্বাভাস দেয় না।
'a' != null
কোনও মান ( true
/ 1
) প্রত্যাবর্তন করা স্বজ্ঞাত নয় এবং সময়ে সময়ে আমাকে ধরে ফেলছে! আমি ভাবতাম "কোন মানের তুলনায় কিছু মান" সর্বদা "সমান নয়", তবে সম্ভবত এটিই কেবল আমার?!?!
SELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'
একটি ধ্রুবক নির্ধারণ করতে পারেন যদি এটি নুওল মান হয় তবে আপনি সেন্ডিনেল মান x (এই ক্ষেত্রে একটি স্ট্রিং / চর) এর জন্য একটি উপযুক্ত ডেটাটাইপ সরবরাহ করে। এটি টিএসকিউএল সিনট্যাক্স তবে ওরাকল এবং অন্যান্য ইঞ্জিনগুলির একই বৈশিষ্ট্য রয়েছে।
মনে রাখবেন যে এই আচরণটি ডিফল্ট (এএনএসআই) আচরণ।
আপনি যদি:
SET ANSI_NULLS OFF
http://msdn.microsoft.com/en-us/library/ms188048.aspx
আপনি বিভিন্ন ফলাফল পাবেন।
SET ANSI_NULLS OFF
স্পষ্টতই ভবিষ্যতে দূরে চলে যাবে ...
create unique index UK_MyTable on MyTable (Column) where Column is not null
): যেখানে একটি এসএমএল সার্ভার সূচীতে ডুপ্লিকেট পেতে পারেন : এমএসডিএন.মাইক্রোসফটি.এইন
SET ANSI_NULLS
বন্ধ থাকে, সমান (=) এবং সমান নয় (<>) তুলনা অপারেটরগুলি আইএসও মান অনুসরণ করে না। একটি নির্বাচনী বিবৃতি ব্যবহার WHERE column_name = NULL
করে যা কলাম_নামে নাল মানযুক্ত সারিগুলি প্রদান করে। একটি নির্বাচনী বিবৃতি যা WHERE column_name <> NULL
কলামে ননাল মান রয়েছে এমন সারিগুলি প্রদান করে। এছাড়াও, একটি নির্বাচনী বিবৃতি যা WHERE column_name <> XYZ_value
XYZ_value নয় এবং NULL নয় এমন সমস্ত সারি প্রদান করে। আইএমএইচও, ফলাফল থেকে নালকে বাদ দেওয়াতে এই শেষ বিবৃতিটি কিছুটা অদ্ভুত বলে মনে হচ্ছে!
এসকিউএল-তে, আপনি যে কোনও কিছুকে মূল্যায়ন / NULL
ফলাফলগুলি অংকন-এ গণনা করে
এই কারণেই SELECT * FROM MyTable WHERE MyColumn != NULL
বা SELECT * FROM MyTable WHERE MyColumn <> NULL
আপনাকে 0 টি ফলাফল দেয়।
NULL
মানগুলির জন্য একটি চেক সরবরাহ করতে , isNull ফাংশন সরবরাহ করা হয়।
IS
তৃতীয় কোয়েরিতে আপনি যেমনটি ব্যবহার করেছিলেন তেমনি আপনি অপারেটরটিও ব্যবহার করতে পারেন ।
আশাকরি এটা সাহায্য করবে.
নুলের একমাত্র পরীক্ষা হ'ল নাল বা নুল নয়। সমতার জন্য পরীক্ষা করা অযৌক্তিক কারণ সংজ্ঞা অনুসারে কেউ জানে না মান কী।
এখানে পড়ার জন্য একটি উইকিপিডিয়া নিবন্ধ:
আমরা ব্যাবহার করি
SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';
মাই কলামটি নুল বা যেখানে সমস্ত সারি যেখানে মাই কলামটি খালি স্ট্রিং রয়েছে সেখানে সারি ফেরাতে। অনেক "শেষ ব্যবহারকারীর" কাছে, NULL বনাম খালি স্ট্রিং ইস্যুটি প্রয়োজন এবং বিভ্রান্তির বিন্দু ছাড়াই একটি পার্থক্য।
নালগুলি অন্যান্য মান বা অন্যান্য নালগুলির সাথে তুলনীয় না করার জন্য আমি কেবল কার্যকরী এবং বিজোড় কারণটি দেখতে পাচ্ছি না, কারণ আমরা এটি পরিষ্কারভাবে তুলনা করতে পারি এবং বলতে পারি যে তারা আমাদের প্রসঙ্গে নয় বা একই same এটা মজার. কিছু যুক্তিসঙ্গত সিদ্ধান্ত এবং ধারাবাহিকতার কারণে আমাদের এটির সাথে ক্রমাগত বিরক্ত হওয়া প্রয়োজন। এটি কার্যকরী নয়, এটিকে আরও কার্যক্ষম করে তুলুন এবং এটি দার্শনিক এবং বিজ্ঞানীদের কাছে রেখে দিন যদি এটি সামঞ্জস্যপূর্ণ হয় বা না এবং এটিতে "সর্বজনীন যুক্তি" রয়েছে কিনা তা উপসংহারে ছেড়ে দিন। :) কেউ বলতে পারেন যে এটি সূচী বা অন্য কোনও কারণে, আমি সন্দেহ করি যে এই জিনিসগুলি নালকে মান হিসাবে সমর্থন করতে পারে না। এটি দুটি খালি গ্লাসের সাথে তুলনা করার মতো, একটি হ'ল লতা গ্লাস এবং অন্যটি বিয়ার গ্লাস, আমরা বস্তুর প্রকারের সাথে তুলনা করছি না তবে সেগুলির সাথে মূল্যবোধগুলি তুলনা করছি, যেমন আপনি ইন্টি এবং বর্ণের সাথে তুলনা করতে পারেন, এটি নাল সাথে ' এমনকি আরও সহজ, এটি কিছুই নয় এবং দুটি দুজনের মধ্যে যা মিল আছে তা একই, আমার দ্বারা এবং স্প্যাকাল লেখার প্রত্যেকের দ্বারা পরিষ্কারভাবে তুলনাযোগ্য, কারণ আমরা কিছু এএনএসআই মানের কারণে অদ্ভুত উপায়ে তাদের তুলনা করে সেই যুক্তিটি অবিচ্ছিন্নভাবে ভেঙে দিচ্ছি। আমাদের জন্য এটি করার জন্য কম্পিউটার শক্তি কেন ব্যবহার করবেন না এবং আমি সন্দেহ করি যে সম্পর্কিত সমস্ত কিছু যদি এই বিষয়টি মাথায় রেখে নির্মিত হয় তবে এটি জিনিসগুলিকে ধীর করে দেবে। "এটি নাল এটি কিছুই নয়", এটি অ্যাপল নয় এটি অ্যাপল, আসুন ... কার্যত আপনার বন্ধু এবং এখানে যুক্তিও রয়েছে। শেষ অবধি কেবলমাত্র জিনিসটি কার্যকারিতা এবং সেভাবে নাল ব্যবহার করা কম বা বেশি কার্যকারিতা এবং ব্যবহারের সহজতা এনে দেয়। এটি আরও দরকারী? কারণ আমরা কিছু যুক্তিসঙ্গতভাবে এএনএসআই মানের কারণে অদ্ভুত উপায়ে তাদের তুলনা করে সেই যুক্তিটি অবিচ্ছিন্নভাবে ভাঙছি। আমাদের জন্য এটি করার জন্য কম্পিউটার শক্তি কেন ব্যবহার করবেন না এবং আমি সন্দেহ করি যে সম্পর্কিত সমস্ত কিছু যদি এই বিষয়টি মাথায় রেখে নির্মিত হয় তবে এটি জিনিসগুলিকে ধীর করে দেবে। "এটি নাল এটি কিছুই নয়", এটি অ্যাপল নয় এটি অ্যাপল, আসুন ... কার্যত আপনার বন্ধু এবং এখানে যুক্তিও রয়েছে। শেষ অবধি কেবলমাত্র জিনিসটি কার্যকারিতা এবং সেভাবে নাল ব্যবহার করা কম বা বেশি কার্যকারিতা এবং ব্যবহারের সহজতা এনে দেয়। এটি আরও দরকারী? কারণ আমরা কিছু যুক্তিসঙ্গতভাবে এএনএসআই মানের কারণে অদ্ভুত উপায়ে তাদের তুলনা করে সেই যুক্তিটি অবিচ্ছিন্নভাবে ভাঙছি। আমাদের জন্য এটি করার জন্য কম্পিউটার শক্তি কেন ব্যবহার করবেন না এবং আমি সন্দেহ করি যে সম্পর্কিত সমস্ত কিছু যদি এই বিষয়টি মাথায় রেখে নির্মিত হয় তবে এটি জিনিসগুলিকে ধীর করে দেবে। "এটি নাল এটি কিছুই নয়", এটি অ্যাপল নয় এটি অ্যাপল, আসুন ... কার্যত আপনার বন্ধু এবং এখানে যুক্তিও রয়েছে। শেষ অবধি কেবলমাত্র জিনিসটি কার্যকারিতা এবং সেভাবে নাল ব্যবহার করা কম বা বেশি কার্যকারিতা এবং ব্যবহারের সহজতা এনে দেয়। এটি আরও দরকারী? এটি আপেল নয় এটি অ্যাপল, আসুন ... কার্যত আপনার বন্ধু এবং এখানে যুক্তিও রয়েছে। শেষ অবধি কেবলমাত্র জিনিসটি কার্যকারিতা এবং সেভাবে নাল ব্যবহার করা কম বা বেশি কার্যকারিতা এবং ব্যবহারের সহজতা এনে দেয়। এটি আরও দরকারী? এটি আপেল নয় এটি অ্যাপল, আসুন ... কার্যত আপনার বন্ধু এবং এখানে যুক্তিও রয়েছে। শেষ অবধি কেবলমাত্র জিনিসটি কার্যকারিতা এবং সেভাবে নাল ব্যবহার করা কম বা বেশি কার্যকারিতা এবং ব্যবহারের সহজতা এনে দেয়। এটি আরও দরকারী?
এই কোডটি বিবেচনা করুন:
SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end
আপনার মধ্যে কতজন জানেন যে এই কোডটি কী ফিরিয়ে দেবে? সাথে বা না ছাড়াই এটি 0 ফিরে আসে me আমার কাছে এটি কার্যকরী নয় এবং এটি বিভ্রান্তিকর। সি # তে এটি যেমনটি হওয়া উচিত তেমনি তুলনা ক্রিয়াকলাপের মান ফিরে আসে, যৌক্তিকভাবে এটিও মান দেয়, কারণ যদি এটি না থাকে তবে তুলনা করার মতো কিছুই নেই (ছাড়া। কিছুই নয় :))। তারা কেবল "বলেছে": নাল "রিটার্ন" 0 এর সাথে তুলনা করে যে কোনও কিছুই 0 এবং এটি অনেকগুলি কাজ এবং মাথাব্যথা তৈরি করে।
এই কোডটি আমাকে এখানে এনেছে:
where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)
আমার কেবল তুলনা করতে হবে যদি দুটি ক্ষেত্রের (যেখানে) আলাদা মান থাকে তবে আমি ফাংশনটি ব্যবহার করতে পারি, তবে ...
তুলনা অপারেটরগুলি ব্যবহার করে কোনও মানের সাথে তুলনা করা যায় না UL নুল = নুল মিথ্যা। নাল একটি মান নয়। আইএস অপারেটরটি বিশেষত NULL তুলনাগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে is
null = null
যেখানে কেউ 1=0
কিছু অ্যাডহক কোয়েরিতে ব্যবহার করতে পারে । আর যদি তারা নালিশ, আমি এটিকে পরিবর্তন করতে null != null
:)
পুরানো প্রশ্ন, তবে নিম্নলিখিতগুলি আরও কিছু বিশদ সরবরাহ করতে পারে।
null
কোনও মান বা অজানা মান উপস্থাপন করে। এটি নির্দিষ্ট করে না কেন কেন কোনও মূল্য নেই, যা কিছুটা অস্পষ্টতার দিকে নিয়ে যেতে পারে।
মনে করুন আপনি এই জাতীয় একটি ক্যোয়ারী চালাচ্ছেন:
SELECT *
FROM orders
WHERE delivered=ordered;
এটি হল, আপনি সারিগুলি সন্ধান করছেন যেখানে তারিখ ordered
এবং delivered
তারিখগুলি একই।
যখন একটি বা উভয় কলাম শূন্য থাকে তখন কী আশা করা যায়?
যেহেতু কমপক্ষে তারিখগুলির একটি অজানা, আপনি এটি আশা করতে পারবেন না যে 2 তারিখগুলি একই। উভয় তারিখ অজানা যখন এটির ক্ষেত্রেও রয়েছে : আমরা যদি সেগুলি না জানি তবে কীভাবে তারা একই হতে পারে?
এই কারণে, কোনও null
মান হিসাবে চিকিত্সা করা ব্যর্থ হতে হবে। এই ক্ষেত্রে, এটি মেলে না। আপনি নিম্নলিখিতটি চেষ্টা করে থাকলে এটিও এই ক্ষেত্রে:
SELECT *
FROM orders
WHERE delivered<>ordered;
আবার আমরা কীভাবে বলতে পারি যে দুটি মান একই নয় তবে সেগুলি কী তা আমরা জানি না।
এসকিউএল এর অনুপস্থিত মানগুলির জন্য একটি নির্দিষ্ট পরীক্ষা রয়েছে:
IS NULL
বিশেষত এটি মানগুলির তুলনা করে না , বরং এটি অনুপস্থিত মানগুলির সন্ধান করে।
অবশেষে, !=
অপারেটর হিসাবে, যতদূর আমি সচেতন, এটি আসলে কোনও মানদণ্ডে নয়, তবে এটি খুব ব্যাপকভাবে সমর্থিত। কিছু ভাষা থেকে প্রোগ্রামারদের বাড়িতে আরও বেশি বোধ করার জন্য এটি যুক্ত করা হয়েছিল। সত্যই, কোনও প্রোগ্রামার যদি তারা কোন ভাষাটি ব্যবহার করছেন তা মনে রাখতে সমস্যা হয় তবে তারা খারাপ শুরু করে to
NULL
সাথে কোনও তুলনা করি তখন এর অর্থ আমরা একটি NULL
মানকে ' একটি মান থাকার' সাথে তুলনা করছি , মানটিকে "নির্ধারিত মানটির সাথে" নির্ধারিত মানটির সাথে নয় " NULL
তবে আমরা জানি না ", যা স্পষ্টতই আমরা কখনও জানতে সক্ষম হব না। এটি সত্যিই জিনিসগুলিকে সহজ করবে।
IS NULL
লেখার চেয়ে অনেক বেশি কঠিন = NULL
। আমি মনে করি এটি পরবর্তী ক্ষেত্রে বিশেষ কেস হিসাবে বিবেচনা না করে তার WHERE columnA = columnB
মতো ব্যাখ্যা করলে আরও সুসংগত হবে WHERE columnA = NULL
। মনে রাখবেন যে NULL
হয় না একটি মান। প্রোগ্রামিং ভাষাগুলিতে যেখানে এটি পরীক্ষা করা বৈধ, variable == null
কারণ null
এর আলাদা অর্থ রয়েছে; এটি অজানা কিছু উপস্থাপন করে না, তবে একটি মান ইচ্ছাকৃত পুনরায় সেট করা। এসকিউএল এর সাথে তেমন নয়।
IS NULL
এবং এর =NULL
মধ্যে কোনও ওভারহেড নেই । তবে হোভারের শেষটি একবার দেখুন। আমি বারবার এটির অভিজ্ঞতা থেকে ক্লান্ত হয়ে পড়েছি load প্রচুর অযৌক্তিক? অতিরিক্ত চেকিং ...
আমি এই কোডটির পরামর্শ দিতে চাই যে আমি কোনও মান পরিবর্তন
i
করে, নতুন মান d
হওয়া এবং পুরাতন হওয়া (যদিও অর্ডারটি বিবেচনা করে না) সন্ধান করতে চাই। এই বিষয়টির জন্য, মান থেকে নাল বা বিপরীতে পরিবর্তন একটি পরিবর্তন কিন্তু নাল থেকে নাল থেকে পরিবর্তন হয় না (অবশ্যই, মান থেকে অন্য মানে পরিবর্তন হয় তবে মান থেকে একই হয় না)।
CREATE FUNCTION [dbo].[ufn_equal_with_nulls]
(
@i sql_variant,
@d sql_variant
)
RETURNS bit
AS
BEGIN
DECLARE @in bit = 0, @dn bit = 0
if @i is null set @in = 1
if @d is null set @dn = 1
if @in <> @dn
return 0
if @in = 1 and @dn = 1
return 1
if @in = 0 and @dn = 0 and @i = @d
return 1
return 0
END
এই ফাংশনটি ব্যবহার করতে, আপনি পারেন
declare @tmp table (a int, b int)
insert into @tmp values
(1,1),
(1,2),
(1,null),
(null,1),
(null,null)
---- in select ----
select *, [dbo].[ufn_equal_with_nulls](a,b) as [=] from @tmp
---- where equal ----
select *,'equal' as [Predicate] from @tmp where [dbo].[ufn_equal_with_nulls](a,b) = 1
---- where not equal ----
select *,'not equal' as [Predicate] from @tmp where [dbo].[ufn_equal_with_nulls](a,b) = 0
ফলাফলগুলি হ'ল:
---- in select ----
a b =
1 1 1
1 2 0
1 NULL 0
NULL 1 0
NULL NULL 1
---- where equal ----
1 1 equal
NULL NULL equal
---- where not equal ----
1 2 not equal
1 NULL not equal
NULL 1 not equal
Sql_variant এর ব্যবহার এটিকে বিভিন্ন ধরণের জন্য উপযুক্ত করে তোলে
নুল কিছুই নয় ... এটি অজানা। NULL কোন কিছুর সমান হয় না। এজন্য আপনাকে আপনার এসকিউএল কোয়েরিতে = NULL এর পরিবর্তে IS NULL ম্যাজিক শব্দটি ব্যবহার করতে হবে
আপনি এটি উল্লেখ করতে পারেন: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
<>
যে এটি ৯২ টি অনুচ্ছেদে রয়েছে তবে বেশিরভাগ বিক্রেতারা সমর্থন করেন!=
এবং / অথবা এটি পরবর্তী বা পরে 99 বা 03 এর মতো নির্দিষ্ট বৈশিষ্ট্যের মধ্যে অন্তর্ভুক্ত রয়েছে