একই SELECT তালিকায় রেফারেন্স কলামের নাম


27

আমি একটি পুরানো এমএস-অ্যাক্সেস-ভিত্তিক সিস্টেমকে পোস্টগ্রিজ এসকিউএলে রূপান্তর করছি। অ্যাক্সেসে, SELECT গুলিতে গঠিত ক্ষেত্রগুলি পরবর্তী ক্ষেত্রগুলির জন্য সমীকরণের অংশ হিসাবে এটি ব্যবহার করা যেতে পারে:

SELECT
    samples.id,
    samples.wet_weight / samples.dry_weight - 1 AS percent_water,
    100 * percent_water AS percent_water_100
FROM samples;

আমি পোস্টগ্রিজ এসকিউএল এ যখন করি, পোস্টগ্রিস একটি ত্রুটি নিক্ষেপ করে:

ত্রুটি: কলাম "শতাংশ_ জল" বিদ্যমান নেই।

উপ-বাছাই করে বাছাই করে আমি কীভাবে এটি ঘিরে কাজ করতে পারি তা এখানে:

SELECT
    s1.id,
    s1.percent_water,
    100 * s1.percent_water AS percent_water_100
FROM (
    SELECT
        samples.id,
        samples.wet_weight / samples.dry_weight - 1 AS percent_water
    FROM samples
    ) s1;

জটিল বাসা বাঁধার জন্য প্রথম কোড ব্লকের মতো কি কোনও শর্টকাট আছে? আমি এটিও বলতে পারি 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100, তবে আমার কোডটিতে গণিতের আরও বৃহত্তর ব্যবস্থাটি কী চলছে তার বাইরে এটি কেবল একটি ছোট্ট উদাহরণ, গণিতের আরও কয়েক ডজন জটিল বিট একে অপরের শীর্ষে সজ্জিত। আমি নিজেকে পুনরাবৃত্তি না করে যথাসম্ভব পরিচ্ছন্নভাবে কাজ করতে পছন্দ করব।

উত্তর:


24

এটি কখনও কখনও অসুবিধে হয় তবে এটি এসকিউএল স্ট্যান্ডার্ড আচরণ এবং এটি অস্পষ্টতাগুলি প্রতিরোধ করে। আপনি একই SELECTতালিকায় কলামের উপমা উল্লেখ করতে পারবেন না ।

খাটো সিনট্যাক্স বিকল্প রয়েছে:

SELECT s.*, s.percent_water * 100 AS percent_water_100
FROM  (
   SELECT id, wet_weight / NULLIF(dry_weight - 1, 0) AS percent_water
   FROM   samples
   ) s;

এবং আপনি LATERALপোস্টগ্রিস 9.3+ এ একটি যোগদান ব্যবহার করতে পারেন :

SELECT s.id, s1.percent_water
     , s1.percent_water * 100 AS percent_water_100
FROM   samples s
     , LATERAL (SELECT s.wet_weight / NULLIF(s.dry_weight - 1, 0) AS percent_water) s1;

আমি NULLIF()বিভাগ দ্বারা বাই শূন্য ত্রুটিগুলির বিরুদ্ধে রক্ষা করতে যোগ করেছি ।


2
হাই। এসকিউএল স্ট্যান্ডার্ট কোন অস্পষ্টতাকে বাধা দেয় তার উদাহরণ দিয়ে আপনি নিজের উত্তর বাড়িয়ে দিতে পারেন?
ইউজেন কনকভ

4

আমি এসকিউএল সার্ভারে 500+ লাইনের নেটেজা কোয়েরি (ওরফে পরিবর্তিত পোস্টগ্রিস) স্থানান্তরিত করার মতো কিছু হিট করেছি। নেটিজায় গণিত কলামের উপনামটি ডাউন স্ট্রিম রেফারেন্সগুলিতে মান হিসাবে ব্যবহারের অনুমতি দেওয়া হয়েছিল।

আমার চারপাশের কাজটি ছিল একটি সংযুক্ত উপ-প্রশ্নের সাথে ক্রস অ্যাপ্লিকেশন ব্যবহার করা। এর সৌন্দর্যটি হ'ল মূল ক্যোয়ারিতে কলামের ওরফে অসংখ্য রেফারেন্সগুলি মোটেও পরিবর্তন করার দরকার ছিল না।

ওপি থেকে কোয়েরি ব্যবহার করে, CROSS APPLYপদ্ধতিটি দেখতে এমন কিছু দেখাচ্ছে:

SELECT
    s.id,
    x.percent_water,
    100 * x.percent_water AS percent_water_100
FROM samples AS s
CROSS APPLY (SELECT s.wet_weight / s.dry_weight - 1 AS percent_water ) x ;

1
CROSS APPLY(এবং আউটার অ্যাপ্লাই) হ'ল LATERALসাবকিউরিগুলি লেখার এসকিউএল সার্ভার উপায় ।
ypercubeᵀᴹ

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