ফাংশন প্যারামিটার এবং মার্কিন যুক্তকরণের সাথে JOIN এর ফলাফলের মধ্যে নামকরণ বিরোধ


17

বর্তমান পোস্টগ্রেস 9.4 এ এই সেটআপ দেওয়া ( এই সম্পর্কিত প্রশ্ন থেকে ):

CREATE TABLE foo (ts, foo) AS 
VALUES (1, 'A')  -- int, text
     , (7, 'B');

CREATE TABLE bar (ts, bar) AS
VALUES (3, 'C')
     , (5, 'D')
     , (9, 'E');

পূর্ববর্তী প্রশ্ন থেকে একটি এসকিউএল ফিডলও রয়েছে

আমি রেফারেন্সড প্রশ্নের উদ্দেশ্য অর্জনের জন্য SELECTএকটি লিখেছিলাম wrote FULL JOINসরলীকৃত:

SELECT ts, f.foo, b.bar
FROM   foo f
FULL   JOIN bar b USING (ts);

নির্দিষ্টকরণ অনুসারে, কলামটি সম্বোধনের সঠিক উপায়টি tsসারণীর যোগ্যতা ছাড়াই। উভয়ই ইনপুট মান ( f.tsবা b.ts) নুল হতে পারে। USINGদফা একটি বিজোড় ক্ষেত্রে একটি বিট তৈরি করে: একটি "ইনপুট" কলামে যে আসলে ইনপুট উপস্থিত না পরিচয় করানো। এখনও পর্যন্ত মার্জিত।

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

CREATE OR REPLACE FUNCTION f_merge_foobar()
  RETURNS TABLE(ts int, foo text, bar text) AS
$func$
BEGIN
   FOR ts, foo, bar IN
      SELECT COALESCE(f.ts, b.ts), f.foo, b.bar
      FROM   foo f
      FULL   JOIN bar b USING (ts)
   LOOP
      -- so something
      RETURN NEXT;
   END LOOP;
END
$func$ LANGUAGE plpgsql;

সমস্যাটি হাইলাইট করার জন্য সাহসী জোর দেওয়া । আমি tsআগের মতো টেবিলের যোগ্যতা ছাড়া ব্যবহার করতে পারি না , কারণ plpgsql একটি ব্যতিক্রম উত্থাপন করবে (কঠোরভাবে প্রয়োজনীয় নয়, তবে বেশিরভাগ ক্ষেত্রে সম্ভবত দরকারী):

ERROR:  column reference "ts" is ambiguous
LINE 1: SELECT ts, f.foo, b.bar
               ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.

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

উত্তর:


19

হুডের অধীনে ডক্স পিএল / পিজিএসকিউএল অনুসারে , আপনি plpgsql.variable_conflictফাংশনটি তৈরি করার আগে বা ফাংশন সংজ্ঞা শুরুর আগে কনফিগারেশন প্যারামিটারটি ব্যবহার করতে পারেন, আপনি কীভাবে এই জাতীয় দ্বন্দ্বগুলি সমাধান করতে চান তা ঘোষণা করে (3 সম্ভাব্য মানগুলি হ'ল ( errorডিফল্ট ) use_variableএবং use_column):

CREATE OR REPLACE FUNCTION pg_temp.f_merge_foobar()
  RETURNS TABLE(ts int, foo text, bar text) AS
$func$
#variable_conflict use_column             -- how to resolve conflicts
BEGIN
   FOR ts, foo, bar IN
      SELECT ts, f.foo, b.bar
      FROM   foo f
      FULL   JOIN bar b USING (ts)
   LOOP
      -- do something
      RETURN NEXT;
   END LOOP;
END
$func$ LANGUAGE plpgsql;

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