কলামগুলির সাথে তুলনা করা হচ্ছে যেগুলিতে NULLS থাকতে পারে - আরও কি আরও সুন্দর উপায় আছে?


16

আমি জানি যে আপনি NULL এর সাথে একটি মানের তুলনা করতে পারবেন না এবং নীচের কোডটিতে এর মতো কিছু না যুক্ত করে ফলাফল প্রত্যাশা করুন ...

SELECT
    *
FROM 
    A INNER JOIN 
    B ON A.ID = B.ID
WHERE
    A.STRING <> B.STRING OR (A.STRING IS NULL AND B.STRING IS NOT NULL) OR (A.STRING IS NOT NULL AND B.STRING IS NULL) OR 
    A.DT <> B.DT OR (A.DT IS NULL AND B.DT IS NOT NULL) OR (A.DT IS NOT NULL AND B.DT IS NULL) OR 
    A.B <> B.B OR (A.B IS NULL AND B.B IS NOT NULL) OR (A.B IS NOT NULL AND B.B IS NULL) OR 
    A.NUM <> B.NUM OR (A.NUM IS NULL AND B.NUM IS NOT NULL) OR (A.NUM IS NOT NULL AND B.NUM IS NULL) 

আমার প্রশ্নটি হ'ল:

দুটি টেবিল জুড়ে পরিবর্তিত মানগুলির পরীক্ষা করার আরও কি আরও সুন্দর উপায় আছে যেখানে দুটিই শূন্য হতে পারে?

সমাধানের জন্য ডেটা প্রকারগুলি জুড়ে অভিন্ন কাজ করা দরকার।

পরীক্ষার টেবিলগুলি সেট আপ করার কোডটি এখানে ...

CREATE TABLE A
(
    ID INT IDENTITY(1,1) NOT NULL,
    STRING VARCHAR(20) NULL,
    DT DATETIME NULL,
    B BIT NULL,
    NUM INT NULL
)

CREATE TABLE B
(
    ID INT IDENTITY(1,1) NOT NULL,
    STRING VARCHAR(20) NULL,
    DT DATETIME NULL,
    B BIT NULL,
    NUM INT NULL
)


INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES (NULL, '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', NULL, 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', NULL, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, NULL)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)


INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('STAGE', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2555-11-11 00:00:00.000', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 999)

উত্তর:


24

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

SELECT * 
FROM   A 
       INNER JOIN B 
         ON A.ID = B.ID 
            AND EXISTS(SELECT A.* 
                       EXCEPT 
                       SELECT B.*) 

এটি দুর্দান্ত, আমি এটি পরীক্ষা করে দেখেছি এবং এটি যেমন প্রয়োজন তেমন আচরণ করে বলে মনে হচ্ছে। অনেক ধন্যবাদ.
GWR

1
আপনি এটি আমাকে মারছেন! যদিও আমাকে স্বীকার করতে হবে আপনি আমাকে এই পদ্ধতিটি শিখিয়েছিলেন। এটা এত সুন্দর. :)
এরিক

মার্টিন, আপনি কি টেবিলগুলি তুলনা করতে এই পদ্ধতির ব্যবহার করছেন যা ডেটা তুলনার জন্য খুব বড়?
এ কে

3

স্ট্যান্ডার্ড এসকিউএল, এসকিউএল সার্ভার 2005 এ সমর্থিত এবং আরও ভাল:

WITH A_MINUS_B 
     AS
     (
      SELECT * 
        FROM A
      EXCEPT 
      SELECT *
        FROM B
     )
SELECT * 
  FROM A_MINUS_B AS T 
       JOIN B ON T.ID = B.ID;

0

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

--c1 = Length of Column1
--c2 = Length of Column2

ISNULL(NULLIF(CONVERT(VARBINARY(cl), LTRIM(RTRIM(Column1))),
              CONVERT(VARBINARY(c2), LTRIM(RTRIM(Column2)))),
       NULLIF(CONVERT(VARBINARY(c2), LTRIM(RTRIM(Column2))),
              CONVERT(VARBINARY(c1), LTRIM(RTRIM(Column1))))) IS NULL

IS NOT NULLঅসম অবস্থা পরীক্ষা করার জন্য আপনি অভিব্যক্তিটির শেষ পরিবর্তন করতে পারেন ।

এই সাহায্য আশা করি।

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