এসকিউএল: কয়েকটি ব্যতীত সমস্ত কলাম নির্বাচন করুন


108

SELECTকোনও সারণীতে নির্দিষ্ট কলামগুলি বাদ দিয়ে কি সমস্ত কলামে যাওয়ার উপায় আছে ? টেবিল থেকে সমস্ত অ-ব্লব বা নন-জ্যামিতিক কলামগুলি নির্বাচন করার জন্য এটি খুব সুবিধাজনক হবে।

কিছুটা এইরকম:

SELECT * -the_geom FROM segments;
  • আমি একবার শুনেছি এই কার্যকারিতাটি এসকিউএল স্ট্যান্ডার্ড থেকে ইচ্ছাকৃতভাবে বাদ দেওয়া হয়েছিল কারণ টেবিলের সাথে কলাম যুক্ত করা কোয়েরির ফলাফলকে বদলে দেবে। এটা কি সত্য? যুক্তি কি বৈধ?
  • বিশেষত পোস্টগ্র্যাস এসকিউএল-তে কি কোনও কাজের সুযোগ নেই?

কোনটি ব্যবহার-কেস যার জন্য আপনি কয়েকটি ব্যতীত সমস্ত কলাম জানতে চান? কিছু ম্যানুয়াল জিজ্ঞাসা করার সময় কি কেবল অন স্ক্রিনটি প্রদর্শন করা উচিত? এটি কোন প্রোগ্রামের অংশ?
joanolo

2
6 অর্থপূর্ণ, সংক্ষিপ্ত কলাম (ক-লা সঙ্গে একটি টেবিল name, age, sid) যে স্ক্রিন প্রস্থে মধ্যে চমত্কারভাবে ফিট করে, একটি দীর্ঘ বাইনারি বরাবর geomকলাম। আমি জ্যামিতি বাইনারি বাদে সমস্ত ক্ষেত্রে জিজ্ঞাসা করতে চাই এবং তাদের নাম একের পর এক লেখা কষ্টকর is
আদম মতান

সেক্ষেত্রে, এসকিউএল নিজেই না করে আপনি ইন্টারেক্টিভ ক্যোয়ারী দিয়ে যে সরঞ্জামটি ব্যবহার করছেন তার সাথে এটি আরও কিছু করতে পারে ...
joanolo

1
@ জোয়ানোলো প্লেইন পোস্টগ্রিএসকিউএল শেল।
আদম মতান

3
এটি এত সুস্পষ্ট দেখাচ্ছে। কখনও কখনও আপনি এক বা দুটি কলাম মুদ্রণ করতে চান না কারণ সেগুলি আকর্ষণীয় নয় বা আপনি কেবল ফলাফলের টেবিলটি পর্দার সাথে ফিট করতে চান (বিশেষত যদি কোনও কমান্ড লাইনের ক্লায়েন্ট ব্যবহার করা হয়)। আমি আশা একটি বাক্য গঠন মতselect (!coluns2,!column5) from sometable;
gumkins

উত্তর:


54

এই জাতীয় বৈশিষ্ট্য পোস্টগ্র্রেস বা এসকিউএল স্ট্যান্ডার্ড (এএফআইকে) তে নেই। আমি মনে করি এটি একটি আকর্ষণীয় প্রশ্ন তাই আমি কিছুটা গুগল করেছিলাম এবং পোস্টগ্রেশনলাইন.কমের একটি আকর্ষণীয় নিবন্ধটি পেয়েছি ।

তারা এমন একটি দৃষ্টিভঙ্গি দেখায় যা স্কিমা থেকে সরাসরি কলামগুলি নির্বাচন করে:

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

আপনি এমন একটি ফাংশন তৈরি করতে পারেন যা এরকম কিছু করে। এই জাতীয় বিষয়গুলি মেলিং তালিকাগুলিতেও আলোচনা করা হয়েছিল, তবে সামগ্রিক sensক্যমত্যটি প্রায় একই রকম ছিল: স্কিমা সম্পর্কে জিজ্ঞাসা করুন।

আমি নিশ্চিত যে এর অন্যান্য সমাধান রয়েছে তবে আমি মনে করি তারা সকলেই একরকম যাদুবিদ্যার স্কিমা-ক্যুরিয়িং-ফু জড়িত।

বিটিডাব্লু: এতে সতর্ক থাকুন SELECT * ...কারণ এতে পারফরম্যান্সের জরিমানা হতে পারে


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

17

আসল উত্তরটি হ'ল আপনি কেবল ব্যবহারিকভাবে পারেন না। দশক ধরে এটি একটি অনুরোধ করা বৈশিষ্ট্য এবং এটি বিকাশকারীরা এটি প্রয়োগ করতে অস্বীকার করেছে।

স্কিমা টেবিলগুলি জিজ্ঞাসা করার প্রস্তাবিত জনপ্রিয় উত্তর দক্ষতার সাথে চালাতে সক্ষম হবে না কারণ পোস্টগ্রিস অপ্টিমাইজার গতিশীল ফাংশনগুলিকে একটি কালো বাক্স হিসাবে বিবেচনা করে (নীচের পরীক্ষার কেসটি দেখুন)। এর অর্থ হ'ল সূচিগুলি ব্যবহার করা হবে না এবং বুদ্ধিমান হয়ে যোগদান করা হবে না। এম 4 এর মতো কোনও ধরণের ম্যাক্রো সিস্টেমের সাহায্যে আপনি আরও ভাল। কমপক্ষে এটি অপ্টিমাইজারকে বিভ্রান্ত করবে না (তবে এটি আপনাকে এখনও বিভ্রান্ত করতে পারে)) কোডটি কল্পনা না করে নিজেই বৈশিষ্ট্যটি না লিখে বা কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ ইন্টারফেস ব্যবহার না করে আপনি আটকে আছেন।

আমি নীচে ধারণার একটি সহজ প্রমাণ লিখেছিলাম যে পিএলপিএইচএসএলএল-তে খুব সাধারণ গতিশীল প্রয়োগের সাথে খারাপ পারফরম্যান্স কেমন হবে তা দেখিয়েছি। আরও খেয়াল করুন যে নীচে আমাকে একটি জেনেরিক রেকর্ড একটি নির্দিষ্ট সারি প্রকারে ফিরিয়ে ফেলাতে বাধ্য করতে হবে এবং কলামগুলি গণনা করতে হবে। সুতরাং এই পদ্ধতিটি 'সমস্তই বাছাই করুন' এর জন্য কাজ করবে না যতক্ষণ না আপনি আপনার সমস্ত টেবিলের জন্য এই ফাংশনটি পুনরায় তৈরি করতে চান।

test=# create table atest (i int primary key);
CREATE TABLE
test=# insert into atest select generate_series(1,100000);
INSERT 0 100000

test=# create function get_table_column(name text) returns setof record as
$$
    declare r record;
    begin
    for r in execute 'select  * from ' || $1 loop
    return next r;
    end loop;
    return; 
    end; 
$$ language plpgsql; 

test=# explain analyze select i from atest where i=999999;
                                                      QUERY PLAN                                    
----------------------------------------------------------------------------------------------------
-------------------
 Index Only Scan using atest_pkey on atest  (cost=0.29..8.31 rows=1 width=4) (actual time=0.024..0.0
24 rows=0 loops=1)
   Index Cond: (i = 999999)
   Heap Fetches: 0
 Planning time: 0.130 ms
 Execution time: 0.067 ms
(5 rows)

test=# explain analyze
    select * from get_table_column('atest') as arowtype(i int) where i = 999999;
                                                        QUERY PLAN                                  
----------------------------------------------------------------------------------------------------
-----------------------
 Function Scan on get_table_column arowtype  (cost=0.25..12.75 rows=5 width=4) (actual time=92.636..
92.636 rows=0 loops=1)
   Filter: (i = 999999)
   Rows Removed by Filter: 100000
 Planning time: 0.080 ms
 Execution time: 95.460 ms
(5 rows)

আপনি দেখতে পাচ্ছেন যে ফাংশন কলটি পুরো টেবিলটি স্ক্যান করেছিল যখন সরাসরি জিজ্ঞাসা সূচকটি ব্যবহার করে ( 95.46 এমএস বনাম 00.07ms ।) এই ধরণের ফাংশনগুলি এমন কোনও জটিল প্রশ্নকে সংযুক্ত করে যা সূচকগুলি ব্যবহার করতে বা টেবিলগুলিতে সঠিক ক্রমে যোগ করতে হবে ।


1
আকর্ষণীয় দৃষ্টিকোণ। কোডের চেয়ে মানব ব্যবহারকারীদের পক্ষে এটি অবশ্যই একটি বৈশিষ্ট্য (বা তাই আমার আশা করা উচিত!) তাই ক্লায়েন্টকে দায়বদ্ধ করার বিষয়টি আমি দেখতে পাচ্ছি। সম্ভবত বর্ধিত প্রদর্শন (on x অন) এর মতো জিনিসগুলি ক্লায়েন্টে খাঁটিভাবে প্রয়োগ করা হয় এবং বাদ দেওয়া কলামগুলি একই জায়গায় প্রয়োগ করা উচিত।
ম্যাক্স মার্ফি

13

এটি পোস্টগ্র্রেএসকিউএল 9.4 দিয়ে শুরু করে যেখানে জেএসওএনবি চালু হয়েছিল এটি কিছুটা সম্ভব। আমি গুগল ম্যাপে সমস্ত উপলব্ধ বৈশিষ্ট্যগুলি (জিওএসএসনের মাধ্যমে) কীভাবে প্রদর্শন করব সে বিষয়ে আমি একই ধরণের প্রশ্নটি নিয়ে ভাবছিলাম।

irc চ্যানেলে jhto JSONB থেকে উপাদান মুছতে চেষ্টা করার পরামর্শ দিল suggested

এই ধারণা

select the_geom,
  row_to_json(foo)::jsonb - 'the_geom'::text attributes
from (
  select * from
  segments
) foo

আপনি স্বতন্ত্র কলামগুলির পরিবর্তে জসন পান, আমি যা চেয়েছিলাম ঠিক এটি ছিল। সম্ভবত জসন পৃথক কলামে আবার প্রসারিত করা যেতে পারে।


হ্যাঁ, সম্ভবত এখান থেকে কিছু, তবে আমি এটি এখনও কাজ করতে পেলাম না
stackoverflow.com/questions/36174881/…

6

গতিশীল এসকিএল স্টেটমেন্ট ব্যবহার করে আপনি যেভাবে করতে পারবেন (তা বলবেন না) কেবলমাত্র উপায়। সিস্টেম ভিউগুলি জিজ্ঞাসা করা এবং টেবিলের কাঠামোটি সন্ধান করা এবং যথাযথ বিবৃতি তৈরি করা সহজ (ড্রকলোসোসের মতো লিখেছেন) easy

PS: আপনি কেন আপনার টেবিলের কাঠামোটি ঠিকঠাক জেনে / না জেনে সমস্ত / কিছু কলাম নির্বাচন করতে চান?


7
আপনার পিএস সম্পর্কিত: কখনও কখনও আমি জ্যামিতিক কলাম সহ একটি টেবিলটি জিজ্ঞাসা করতে চাই, খুব দীর্ঘ জ্যামিতি স্ট্রিংটি প্রদর্শন না করে যা আউটপুটটি গারবেল করে। আমি সমস্ত কলাম নির্দিষ্ট করতে চাই না, কারণ সেখানে কয়েক ডজন থাকতে পারে।
আদম মতান

সুতরাং কেবল গতিশীল স্কয়ারগুলি আপনাকে প্রচুর টাইপিং থেকে রক্ষা করতে পারে :-)।
মেরিয়ান

প্রত্যেকেই ধরে নিয়েছে যে যিনি ক্যোয়ারী তৈরি করেন তিনি হলেন তিনিই যিনি ডাটাবেসটি ডিজাইন করেছিলেন। :-) মনে করুন যে একটি এক্সেল তৈরি করার জন্য আপনাকে অনেকগুলি ক্ষেত্রের (30 টিরও বেশি) একটি পুরাতন ডাটাবেস অনুসন্ধান করতে হবে, তবে এমন একটি বা দুটি ক্ষেত্র রয়েছে যাতে সংবেদনশীল তথ্য রয়েছে যা আপনি সরবরাহ করতে চান না।
yucer

3

গতিশীলভাবে উপরে বর্ণিত হিসাবে একমাত্র উত্তর তবে আমি এটি প্রস্তাব করব না। আপনি যদি দীর্ঘমেয়াদে আরও কলাম যুক্ত করেন তবে সেটির জন্য প্রয়োজনীয় জিজ্ঞাসাটির প্রয়োজন নেই?

আপনার প্রয়োজনের তুলনায় আপনি আরও কলাম টানা শুরু করবেন।

নির্বাচনটি যদি সন্নিবেশের অংশ হিসাবে হয় তবে কী হবে

টেবিলএ colোকান (কল 1, কল 2, কল 3 .. কোলন) টেবিলবি থেকে 2 কলাম ব্যতীত সমস্ত কিছু নির্বাচন করুন

কলামের মিলটি ভুল হবে এবং আপনার সন্নিবেশ ব্যর্থ হবে।

এটি সম্ভব তবে আমি প্রায় প্রতিটি কলামের প্রয়োজন পরেও প্রতিটি নির্বাচনের জন্য প্রয়োজনীয় কলাম লেখার পরামর্শ দিচ্ছি।


এই পদ্ধতির স্পষ্টতই প্রোগ্রামামগতভাবে ভুল, তবে এটি এর জন্য একটি কনসোল ক্যোয়ারী হিসাবে নির্দোষ এবং কার্যকর SELECT
আদম মতান

3

যদি আপনার লক্ষ্যটি বড় ডেটা মানগুলির সাথে কলামগুলি প্রদর্শন না করে ডিবাগ করার সময় পর্দা থেকে বিশৃঙ্খলা অপসারণ করা হয়, তবে আপনি নিম্নলিখিত কৌশলটি ব্যবহার করতে পারেন:

("hstore" অবদান প্যাকেজটি ইনস্টল করুন যদি আপনার কাছে ইতিমধ্যে এটি না থাকে: " CREATE EXTENSION hstore;")

কল 1, কল 2, কল 3 সহ একটি টেবিলে "পরীক্ষার" জন্য আপনি "কল 2" এর মানটি প্রদর্শনের আগে নালায় সেট করতে পারেন:

select (r).* from (select (test #= hstore('col2',null)) as r from test) s;

অথবা, প্রদর্শন করার আগে দুটি কলাম নালায় সেট করুন:

select (r).* from (select (test #= hstore('col2',null) #= hstore('col1',null)) as r from test) s;

সতর্কবাণী হ'ল হস্টোরে রেকর্ড টাইপ ফিডিং সংজ্ঞায়িত করতে হবে বলে "পরীক্ষা" একটি টেবিল হতে হবে (একটি উপনাম বা সাবলেট কাজ করবে না)।


3

আমি সবেমাত্র আবিষ্কার করেছি এমন একটি কার্যপ্রণালী রয়েছে, তবে এটির জন্য আরকিউর থেকে এসকিউএল কোয়েরিগুলি প্রেরণ করা দরকার R এটি আর ব্যবহারকারীদের পক্ষে কার্যকর হতে পারে।

মূলত dplyrপ্যাকেজটি এসকিউএল (এবং বিশেষত PostgreSQL) পাঠায় এবং -(column_name)যুক্তিটি গ্রহণ করে ।

সুতরাং আপনার উদাহরণ নিম্নরূপ লেখা যেতে পারে:

select(segments, -(the_geom))

3

ইন একটি মন্তব্য ব্যাখ্যা আপনার অভিপ্রায় না প্রদর্শন করার সুবিধা আছে হয় বিষয়বস্তু দীর্ঘ কন্টেন্ট সঙ্গে কলামের বদলে কলাম নিজেই প্রদর্শন না:

… কখনও কখনও আমি জ্যামিতিক কলাম সহ একটি টেবিলটি জিজ্ঞাসা করতে চাই, খুব দীর্ঘ জ্যামিতি স্ট্রিংটি প্রদর্শন না করে যা আউটপুটকে গারবেল করে। আমি সমস্ত কলাম নির্দিষ্ট করতে চাই না, কারণ সেখানে কয়েক ডজন থাকতে পারে।

কোনও সহায়ক ফাংশনের সহায়তায় এটি সম্ভব, যা দীর্ঘ বিষয়বস্তুর সাথে প্রতিস্থাপন করে null( textআমার উদাহরণের কোনও কলাম, তবে আপনি যে ধরণের দমন করতে চান তার জন্য আপনি এটি পরিবর্তন করতে পারবেন):

create table my_table(foo integer, bar integer, baz text);
insert into my_table(foo,bar,baz) values (1,2,'blah blah blah blah blah blah'),(3,4,'blah blah');
select * from my_table;
foo | বার | বায                          
-: | -: | : ----------------------------
  1 | 2 | ব্লা ব্লা ব্লা ব্লা ব্লা ব্লা
  3 | 4 | বেলা বেলা                    
create function f(ttype anyelement) returns setof anyelement as
$$
declare
  toid oid;
  tname text;
  nname text;
  cols text;
begin
  --
  select pg_type.oid, pg_namespace.nspname, pg_type.typname
  into toid, nname, tname
  from pg_type join pg_namespace on pg_namespace.oid=pg_type.typnamespace
  where pg_type.oid=pg_typeof(ttype);
  --
  select string_agg((case when data_type<>'text' 
                          then column_name 
                          else 'null::'||data_type||' "'||column_name||'"' end)
                   ,', ' order by ordinal_position)
  into cols
  from information_schema.columns 
  where table_schema=nname and table_name=tname;
  --
  return query execute 'select '||cols||' from '||nname||'.'||tname;
  --
end
$$ language plpgsql;
select * from f(null::my_table);
foo | বার | বায
-: | -: | : ---
  1 | 2 | নাল 
  3 | 4 | খালি

এখানে ডিবিফিডল


2
  • অ্যাপ্লিকেশন দৃষ্টিকোণ থেকে, এটি একটি অলস সমাধান। নতুন কলাম (গুলি) দিয়ে কী করবেন তা কোনও অ্যাপ্লিকেশন স্বয়ংক্রিয়ভাবে জানতে পারে না।

    ডেটা ব্রাউজার অ্যাপ্লিকেশনগুলি ডেটার জন্য মেটাডেটা জিজ্ঞাসা করতে এবং চলমান ক্যোয়ারী থেকে কলামগুলি বাদ দিতে পারে বা কলামের ডেটার একটি উপসেট নির্বাচন করতে পারে। যুক্ত হওয়ার সাথে সাথে নতুন BLOB গুলি বাদ দেওয়া যেতে পারে। চাহিদার ভিত্তিতে নির্দিষ্ট সারিগুলির জন্য BLOB ডেটা নির্বাচন করা যেতে পারে।

  • যে কোনও এসকিউএল বৈকল্পিক যা গতিশীল ক্যোয়ারিকে সমর্থন করে, সারণী মেটা ডেটাতে কোয়েরি ব্যবহার করে ক্যোয়ারী তৈরি করা যেতে পারে। আপনার অভিপ্রায়ের জন্য, আমি নামের পরিবর্তে কলামগুলি বাদ দেব।


2

আপনি কখনই *এসকিউএল-দেখুনগুলিতে দেখতে পাবেন না ... \d any_viewআপনার পরীক্ষা করুন psql। অভ্যন্তরীণ উপস্থাপনের জন্য একটি (অন্তঃসুখী) প্রাকপ্রসেসিং রয়েছে


এখানে সকল আলোচনা দেখায় যে বিষয়টি প্রস্তাব (প্রশ্ন ও আলোচনায় অন্তর্নিহিত) প্রোগ্রামারদের জন্য একটি বাক্য গঠন চিনি, না একটি বাস্তব "এসকিউএল অপ্টিমাইজেশান ইস্যু" ... আচ্ছা, আমার অনুমান, এটা প্রোগ্রামারদের 80% জন্য হয়।

সুতরাং " অন্তঃসংশোধনের সাথে প্রাক-পার্সিং " হিসাবে প্রয়োগ করা যেতে পারে ... আপনি যখন এসকিউএল-VIEW এর মাধ্যমে ঘোষণা করেন তখন পোস্টগ্রেএসকিউএল কী করবে তা দেখুন SELECT *: ভিউ-কনস্ট্রাক্টর *সমস্ত কলামের একটি তালিকাতে রূপান্তরিত করে (অন্তর্নির্ধারণের দ্বারা এবং এই মুহুর্তে আপনি চালনা করেন) উত্স-কোডটি তৈরি করুন)।

তৈরি দেখুন এবং প্রস্তুতি জন্য বাস্তবায়ন

এটি একটি কার্যকর বাস্তবায়ন। ধরুন tক্ষেত্র সহ টেবিল (id serial, name text, the_geom geom)

CREATE VIEW t_full AS SELECT * FROM t;
-- is transformed into SELECT id,name,the_geom FROM t;

CREATE VIEW t_exp_geom AS SELECT * -the_geom FROM t;
-- or other syntax as EXCEPT the_geom
-- Will be transformed into SELECT id,name FROM t;

পূর্বের বিবৃতি একই ।

... সুতরাং, এটি সম্ভব, এবং এটিই হ'ল 80% প্রোগ্রামারদের দরকার, প্রস্তুতি এবং দর্শনগুলির জন্য একটি সিনট্যাক্স চিনি!


উল্লেখ্য: অবশ্যই টেকসই সিনট্যাক্স সম্ভবত নয় - column_name, যদি সেখানে পোস্টগ্রি মধ্যে কিছু দ্বন্দ্ব হয়, তাই আমরা পরামর্শ দিতে পারেন EXCEPT column_name,
EXCEPT (column_name1, column_name2, ..., column_nameN)বা অন্যান্য।


1

সমস্ত কলাম একটি প্রত্যাশা নির্বাচন করতে এটি আমার ফাংশন। আমি postgresonline.com এবং postgresql টিউটরিয়াল এবং অন্যান্য উত্স থেকে ধারণা একত্রিত ।

CREATE TABLE phonebook(phone VARCHAR(32), firstname VARCHAR(32),
lastname VARCHAR(32), address VARCHAR(64));
INSERT INTO phonebook(phone, firstname, lastname, address) 
VALUES ('+1 123 456 7890', 'John', 'Doe', 'North America'), 
('+1 321 456 7890', 'Matti', 'Meikeläinen', 'Finland'), 
('+1 999 456 7890', 'Maija', 'Meikeläinen', 'Finland'), 
('+9 123 456 7890', 'John', 'Doe', 'Canada'), 
('+1 123 456 7890', 'John', 'Doe', 'Sweden'), 
('+1 123 456 7890', 'John', 'Doe2', 'North America');

drop function all_except_one(text,text);
CREATE OR REPLACE FUNCTION all_except_one(to_remove TEXT, table_name1 TEXT) 
RETURNS void AS $$

 DECLARE 
 rec_row RECORD;
 curs1 refcursor ;

 BEGIN
  --print column names:
  raise notice '%', ('|'|| ARRAY_TO_STRING(ARRAY(SELECT 
  COLUMN_NAME::CHAR(20) FROM INFORMATION_SCHEMA.COLUMNS WHERE
  TABLE_NAME=table_name1 AND COLUMN_NAME NOT IN (to_remove) ), 
  '|') ||'|') ; 

  OPEN curs1 FOR
  EXECUTE 'select table_1  from (SELECT ' || ARRAY_TO_STRING(ARRAY(
  SELECT COLUMN_NAME::VARCHAR(50) FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME=table_name1 AND COLUMN_NAME NOT IN (to_remove)    
  ), ', ') || ' FROM ' || table_name1 || ' limit 30)   table_1 ';

  LOOP
  -- fetch row into the rec_row
  FETCH curs1 INTO rec_row;

  -- exit when no more row to fetch
  EXIT WHEN NOT FOUND;

  -- build and print the row output

  raise notice '%',(select'| '|| regexp_replace( array_to_string(
  array_agg(a::char(20)),'|'),'["\(.*\)]+',   '','g') ||'|'  from 
  unnest(string_to_array(replace(replace(replace(trim(rec_row::text,
  '()'),'"',''), ', ','|'),')',' '),',')) as a);

  END LOOP;

  -- Close the cursor

  CLOSE curs1;

  END; $$ LANGUAGE plpgsql;

select  all_except_one('phone','phonebook');

--output:
--NOTICE:  |firstname           |lastname            |address             |
--NOTICE:  | John               |Doe                 |North America       |
--NOTICE:  | Matti              |Meikeläinen         |Finland             |
--NOTICE:  | Maija              |Meikeläinen         |Finland             |
--NOTICE:  | John               |Doe                 |Canada              |
--NOTICE:  | John               |Doe                 |Sweden              |
--NOTICE:  | John               |Doe2                |North America       |
-- all_except_one 
-- ----------------
-- (1 row)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.