আমি কলামের স্টেটমেন্টটি কেন কলামটি বিদ্যমান নেই এবং এটি থেকে নির্বাচন করে নেই তা দেখতে কেন ব্যবহার করতে পারি না?


17

কেন এই জাতীয় কিছু কাজ করে না?

SELECT
CASE 
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;

আমি কেবল কলামটি উপস্থিত আছে কিনা তা যাচাই করে দেখছি, তবে এসকিউএল সার্ভার Somecolবিদ্যমান না থাকার বিষয়ে অভিযোগ করে । একক বিবৃতিতে এর বিকল্প আছে কি?


3
আপনি কেন এটি করতে চান তার কোনও উদাহরণ আছে? আমি বুঝতে পারি না আপনি কেন এমন ক্যোয়ারী লিখতে চান যা কোনও কলাম থেকে নির্বাচন করার চেষ্টা করে যা নাও থাকতে পারে।
সিঙ্কিনসন

4
এসকিউএল সার্ভার মূল্যায়ন করে যে আপনার বিবৃতি বাক্য গঠনটি কার্যকর করার আগে এটি সঠিক is অতএব রেফারেন্সযুক্ত সমস্ত কলাম অবশ্যই টেবিলের মধ্যে উপস্থিত থাকতে হবে, এমনকি যদি সেগুলি CASEবিবৃতিতে আবৃত থাকে ।
সিঙ্কিনসন

@ মার্কসিংকনসন: সিনট্যাক্সের পরে নামগুলি পরীক্ষা করা হয়, তবে হ্যাঁ, এসকিউএল সার্ভার বাস্তবে ব্যাচ চালানোর আগে তা করে does
অ্যান্ড্রি এম

1
থেকে নির্বাচন INFORMATION_SCHEMAকরা একটি workaround হিসাবে কাজ করতে পারে।
ব্রিলিয়ান্ড

উত্তর:


43

নিম্নলিখিত প্রশ্নের সাথে হিসাবে একই ধারণা ব্যবহার এই আশ্চর্যজনক উত্তর দ্বারা ypercube :

SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY
(
  SELECT
    ID,
    SomeCol AS MyTest
  FROM dbo.Customers
) AS x;

এটি এর মতো কাজ করে:

  • যদি dbo.Customersএকটি কলামের নাম দেওয়া থাকে SomeColতবে SomeColএর SomeCol AS MyTestসমাধান হবে dbo.Customers.SomeCol;

  • যদি সারণীতে এর মতো কোনও কলাম না থাকে তবে রেফারেন্সটি এখনও বৈধ থাকবে, কারণ এখন এটি সমাধান হবে dummy.SomeCol: dummyকলামগুলি সেই প্রসঙ্গে উল্লেখ করা যেতে পারে।

আপনি একাধিক "অতিরিক্ত" কলামগুলি সেভাবে নির্দিষ্ট করতে পারেন। কৌশলটি এই জাতীয় কলামগুলির জন্য টেবিলের ওরফে ব্যবহার না করা (যা বেশিরভাগ পরিস্থিতিতে একটি উদ্ভট অনুশীলন, তবে সেক্ষেত্রে টেবিলের নামটি বাদ দেওয়া আপনাকে সমস্যাটি সমাধান করতে সহায়তা করে)।

যদি টেবিলটি একটি জোড়তে ব্যবহৃত হয় এবং অন্য টেবিলটির নিজস্ব থাকে SomeCol, কৌশলটি চালিয়ে যাওয়ার জন্য আপনার সম্ভবত সম্ভবত উপরোক্ত ক্যোয়ারীটিকে জয়েন্টে ব্যবহার করার আগে একটি উত্সযুক্ত টেবিল হিসাবে ব্যবহার করতে হবে, এরকম কিছু:

SELECT ...
FROM
(
  SELECT x.*
  FROM (SELECT NULL AS SomeCol) AS dummy
  CROSS APPLY (
    SELECT
      ID,
      SomeCol AS MyTest
    FROM dbo.Customers
  ) AS x
) AS cust
INNER JOIN ...
;

1
আমি ভাবছি যে এসকিউএল সংকলকটি যদি কেবল একটি সামান্য বিট জটিল হয়। আপনি কি করতে পারেন দুর্দান্ত দুর্দান্ত।
ম্যাক্স ভার্নন

9

এটি করার একটি উপায় হ'ল কলামগুলির অস্তিত্ব পরীক্ষা করা, তারপরে সেই কলামটি বিদ্যমান কিনা না তার ভিত্তিতে ডায়নামিক এসকিউএল তৈরি করুন।

ডায়নামিক এসকিউএল ব্যতীত এসকিউএল সার্ভার স্ট্যাটমেন্টটি কার্যকর করার আগে কলামটি উপস্থিত রয়েছে কি না তা মূল্যায়ন করার চেষ্টা করবে যার ফলস্বরূপ ত্রুটি ঘটেছে।

এটি এর অর্থ হ'ল আপনার কাছে লিখতে 2 টি প্রশ্ন থাকবে এবং ভবিষ্যতে সম্ভাব্য পরিবর্তিত হবে। তবে আমি বিশ্বাস করি SELECTনা যে কলামগুলিতে আপনার অস্তিত্ব থাকতে পারে এমন বক্তব্যগুলি সত্যই লক্ষ্য করা উচিত ।

declare @SQL varchar(max)

If exists (select 1 from sys.columns where Name = N'NameOfColumn' and object_id=object_id(N'yourTableName'))
begin
set @SQL = 'select ID, NameOfColumn from yourTableName'
exec(@sql)
end
else
begin
Print 'Column does not exist'
end

হ্যাঁ, বোঝা যায়, তবে অবশ্যই একটি বিবৃতিতে থাকতে হবে। শেষ পর্যন্ত, আমি সম্ভবত কিছু ম্যাজিক সিস্টেম ফাংশন খুঁজছি যার অস্তিত্ব নেই।
কারসন রিনকে

4

আপনি ক্যোয়ারী কলাম যে কিছু এক্সএমএল ব্যবহার করতে পারেন পারে টেবিলে হও।

ক্রস প্রয়োগে প্রতিটি সারিতে প্রতিটি কলাম থেকে একটি এক্সএমএল তৈরি করুন এবং values()ফাংশনটি ব্যবহার করে মানটি বের করুন ।

এই ক্যোয়ারিতে আইডি পরিচিত তাই এটি সরাসরি টেবিল থেকে পান। কল 1 এবং কল 2 থাকতে পারে বা তাই এক্সএমএল ব্যবহার করে তা পেতে পারেন।

select T.ID,
       TX.X.value('(Col1/text())[1]', 'int') as Col1,
       TX.X.value('(Col2/text())[1]', 'int') as Col2
from T
  cross apply (select T.* for xml path(''), type) as TX(X)

এসকিউএল ফিডল


-1

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

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

SELECT COUNT(*) FROM sys.columns WHERE sys.columns.name = 'FarmID'

1
sysobjectsনির্দিষ্ট সারণিতে এরকম একটি কলাম রয়েছে কিনা তা পরীক্ষা করতে কেন আপনার ক্যোয়ারীতে পাশাপাশি ব্যবহার করবেন না ?
ypercubeᵀᴹ

হ্যাঁ… আমি উল্লেখ করেছি যে এটি করা যেতে পারে… আপনি যে বিশেষ টেবিলটি সম্পর্কে জিজ্ঞাসা করছেন তা আপনি এমনকি একইভাবে করতে পারেন… আমি কেবল COUNT ব্যবহারের জন্য সাধারণ ফর্ম্যাটটি দেখিয়েছি কারণ COUNT টি শূন্যের সময় COUNT ত্রুটি করে না এবং ... আমি মনে করি যে আমার উচিত আপনি এটি একটি ভেরিয়েবলকেও নির্ধারণ করতে পারেন তা উল্লেখ করুন। (যেমন নির্বাচন করুন নির্বাচন করুন কাউন্ট (*) হিসাবে MyVarName…)
জিনজাই

1
মার্কের ক্যোয়ারীর চেয়ে এটি কীভাবে ভাল হবে তা আমি দেখতে পাচ্ছি না। SELECT 1 ...ত্রুটি হয় না।
ypercubeᵀᴹ

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

আপনার যদি গণনা প্রয়োজন ঠিক আছে। তবে EXISTS (SELECT ...)প্রায় দ্রুততর (SELECT COUNT(*) ...), অন্যভাবে নয়।
ypercubeᵀᴹ

-3

আমি যদি এটি সঠিকভাবে বুঝতে পারি ...

আপনি কোয়েরিকে নীচের মতো কিছু ব্যবহার করতে পারেন এবং সেই অনুযায়ী গণনার উপর ভিত্তি করে কাজ করতে পারেন ... যদি গণনাটি> 1 হয় তবে এর অর্থ আপনার কাছে সেই টেবিলের কোল আছে, এবং গণনা = 0 তবে আপনার কাছে সেই কোল নেই টেবিল

নির্বাচন গণনা (*)
থেকে তথ্য তথ্য
CHCHMAMA.COLUMNS যেখানে COLUMN_NAME ইন ('আইডি') এবং ট্যাবলেট_সচেমি = 'ডিবিও' এবং TABLE_NAME = 'ইউজারবেস';


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