মাইএসকিউএল - সমস্ত কলামে একটি মান কীভাবে পরীক্ষা করবেন


11

আমি কৌতূহলী, প্রদত্ত মানের জন্য সমস্ত কলাম অনুসন্ধান করার জন্য কি কোনও ভাল উপায় আছে? আমার উদ্দেশ্যগুলির জন্য, এটি মোটেও দ্রুত হওয়ার দরকার নেই, এটি কেবল 1-অফ কিন্ডা জিনিস এবং আমি প্রতিটি ক্ষেত্রের নাম টাইপ করতে চাই না। এটাই হ'ল আপাতত আমি যা করবো, তবে আমি মনে করি এর থেকে আরও ভাল উপায় আছে।

আমি এটি চালু করতে চাই:

SELECT * FROM table WHERE col1 = 'val' OR col2 = 'val' OR col3 = 'val';

এটিতে:

SELECT * FROM table WHERE * = 'val'

... বা, আরও ভাল (যদিও আমি এটিতে গুরুতরভাবে সন্দেহ করি ...)

SELECT * FROM table WHERE * like '%val%'

আমি দেখেছি এই , যা ধরণ নয়-সত্যিই ঘনিষ্ঠ বলে মনে হয়, কিন্তু আমি কিছুই কাছাকাছি না খোঁজার করছি:

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)

পার্থক্য হচ্ছে, এটি নির্দিষ্ট মানগুলির জন্য কলামগুলির একটি নির্বাচন সন্ধান করে, আমি একক মানের জন্য সমস্ত কলাম অনুসন্ধান করার চেষ্টা করছি।

এটি যদিও গুরুত্বপূর্ণ নয়, যেমন আমি কেবল কৌতুহলী কিছু থেকে বেশি বলেছি

উত্তর:


23

এসকিউএল এটি করার একটি ভাল উপায় সরবরাহ করে না কারণ এটি সম্ভবত একটি ভাল টেবিল ডিজাইন নয় যাতে এন কলামগুলির একই ডোমেনে মান থাকতে পারে। এই সম্ভাব্য "পুনরাবৃত্তি গ্রুপ" মত যদি আপনি কলাম আছে একটি ক্ষেত্রে দেখা যায় phone1, phone2, phone3, ... phoneN

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

যদি আপনি এটি করেন, তবে আপনাকে কেবল নির্ভরশীল টেবিলের একটি কলামে নির্দিষ্ট মানটি অনুসন্ধান করতে হবে।

SELECT t.* FROM mytable AS t
JOIN phones AS p ON t.primaryKey = p.refKey 
WHERE p.phone = ?

1
এবং যদি কোনও কারণে আপনি টেবিল বিন্যাসটি পরিবর্তন করতে না পারেন, আপনি এই বিন্যাসে ডেটা উপস্থাপন করে এমন একটি ভিউ লিখতে পারেন, তারপরে ভিউটিটি জিজ্ঞাসা করুন।
কোডকাস্টার

10
না, কেবল টেবিলের বিন্যাস পরিবর্তন করুন। এটাই. আমি "আমি এটি পরিবর্তন করতে পারি না", অজুহাতে ক্লান্ত। আমি আর তা গ্রহণ করি না। এখন বিষয়গুলি কীভাবে পরিবর্তন করা যায় তা শেখার সময়।
বিল কারভিন

15

আপনি যত কাছাকাছি পেতে পারেন এটি ব্যবহার করে IN:

SELECT * FROM table WHERE 'val' IN (col1, col2, ..., colN) ;

আপনি চেক করতে চান এমন সমস্ত কলাম আপনাকে এখনও লিখতে হবে।
এবং এটি আপনার ORমত প্রকাশের চেয়ে আলাদা নয়, কার্য সম্পাদন বা অন্যথায় নয়। এটি কিছুটা কম অক্ষর সহ অভিব্যক্তিটি লেখার ঠিক একটি ভিন্ন, সমতুল্য উপায়।


3

আপনার এটি দুটি ধাপে করা দরকার, প্রথমে এসকিউএল তৈরি করুন (ধরে নিবেন যে আপনার টেবিলটির নাম স্কিমা এস তে টি করা হয়েছে:

select concat(' SELECT * FROM t WHERE ''a'' in ('
             , GROUP_CONCAT(COLUMN_NAME)
             , ')')
from INFORMATION_SCHEMA.columns 
where table_schema = 's' 
  and table_name = 't'
  and DATA_TYPE IN ('char','varchar');

এখন আপনি এই স্ট্রিং কার্যকর করতে পারেন। নোট করুন যে আপনাকে অতিরিক্ত সহ 'ক' উদ্ধৃতি দিতে হবে। যদি আপনি এটি উদাহরণস্বরূপ একটি পদ্ধতি রাখেন তবে আপনি তৈরি হওয়া স্ট্রিংটি প্রস্তুত ও সম্পাদন করতে পারেন।

আমি এটি দিয়ে পরীক্ষা করেছি:

create table t (a char(3), b varchar(5), c int);
insert into t(a,b) values ('a','b'),('b','c'),('c','c');    

কোয়েরি উত্পন্ন যেখানে:

SELECT * FROM t WHERE 'a' in (a,b)

এবং ফলাফল যে কার্যকর:

a   b   c
---------
a   b   

1

আমি এটি জিজ্ঞাসা করে এক বছর হয়ে গেছে বলে মনে হচ্ছে, তবে আমি ঠিক যা খুঁজছিলাম তা হ'ল আমি হোঁচট খেয়েছি! এটি কোনও এসকিউএল বিবৃতি নয়, যেমনটি আমি প্রত্যাশা করছিলাম তবে এটি আমি যা চাইছিলাম তা করে।

মাইএসকিউএল ওয়ার্কবেঞ্চে আপনি টেবিল বা স্কিমাটিতে ডান ক্লিক করতে পারেন এবং সারণী ডেটা অনুসন্ধান করতে পারেন।স্কিমা প্রসঙ্গে মেনু


0

আর একবার চেষ্টা কর:

select
    *
from
    _table_
where
    concat('.', col1, '.', col2, '.', col3, '.') like "%.search_value.%";

এটি ধরে নিয়েছে যে .আপনার অনুসন্ধানের স্ট্রিংয়ে কোনও নেই । যদি আপনি এটির গ্যারান্টি দিতে না পারেন, তবে আপনি কোনও আলাদা "বিভাজক চরিত্র" ব্যবহার করতে পারেন।


1
আপনার সমাধান কেন কাজ করে দয়া করে ব্যাখ্যা করতে পারেন? কোডের উত্তরগুলি এখানে ভাল উত্তর হিসাবে দেখা হয় না।
জর্জ.পালাসিয়োস

এটা কাজ করে না। উদাহরণস্বরূপ যদি তে অনুসন্ধানে থাকে %বা _কোনও কলাম থাকে.
জেসেন

1
@ জেসেন আপনি বিশেষ অক্ষরগুলি থেকে বাঁচতে এবং একটি আলাদা বিভাজক ব্যবহার করতে পারেন।
Anon0012398193

@ জর্জ.পালসিওস - আপনি কী অস্পষ্ট বলে মনে করেন?
Anon0012398193

সঠিক বিভাজক বাছাই করা খুব কঠিন হতে পারে। এই পদ্ধতিটি সঠিকভাবে করা খুব কঠিন
জেসেন

0

সহজ সমাধানটি করছে

mysqldump ... --skip-extended-insert db table | grep 'val'

যদি না Val কিছু SQL সিনট্যাক্স একটি সাধারণ occurence হয় না।


আমি আশা করি আপনি আমাকে উপহাস করছেন, বিকল্প হিসাবে আপনি ভেবেছিলেন এটি সহায়ক হবে।
donutguy640

1
আমি অবশ্যই না। এটি ডিবি / টেবিলে "কোথায়" আছে তা আপনি যদি না জানেন তবে এটি কোনও কিছুর সন্ধান করার একটি বৈধ উপায়। গ্রেপ যেখানে মান উপস্থিত রয়েছে সেখানে পুরো সারিগুলি (টেবিলের নাম সহ) ফিরিয়ে দেবে। এটি এসকিউএল নয় এবং আপনি যদি আউটপুটটিকে প্রোগ্রামক্রমে প্রক্রিয়া করতে চান তবে খুব কার্যকর নয় তবে এটি সহজ এবং বেশ দ্রুত।
jkavalik

-2

এটা চেষ্টা কর.

SELECT *
FROM table
WHERE CONCAT(col1,' ',col2,' ',col3)="val val val";

কনক্যাট () কলাম মানগুলি পৃথক করতে ব্যবহৃত হয় যেমন আপনি এখানে নিজের কলামটি স্থানের সাথে পৃথক করতে পারেন ফাংশনের ভিতরে আরও ভাল ফলাফল নির্দিষ্ট করতে এবং মানটি স্থানের সাথে পৃথক করা স্ট্রিংও পরীক্ষা করতে পারেন এবং ফলাফলটি আপনার হাতে রয়েছে।


-3

তথ্য_স্কেমা ডাটাবেস ব্যবহার করে এটি সম্ভব, আমরা মূলত কেবলমাত্র একটি নির্দিষ্ট টেবিলের সমস্ত কলাম তালিকাভুক্ত করব তারপরে তাদেরকে একটি লাইন হিসাবে তালিকাভুক্ত করার জন্য GROUP_CONCAT ব্যবহার করব এবং একটি IN বিবৃতিতে ফিড করব।

select * from db.table where 'value' in (select GROUP_CONCAT(COLUMN_NAME) from INFORMATION_SCHEMA.columns where table_schema = 'db' and table_name = 'table');

সমস্ত মান কলামে 'মান' উপস্থিত থাকলে এটি কেবল একটি সারি প্রদান করবে।


1
মানে if 'value' is present in any of the columns? তদতিরিক্ত, আপনি স্ট্রিং ধরণের জন্য একটি শিকারী যুক্ত করতে পারেন যেমন: `এবং ডেটা_TYPE ইন ('চর', 'বার্তা')`
লেনার্ট

1
এটি এটি করবে এবং কলামগুলিকে সুস্পষ্টভাবে নামকরণ এড়াতে ওপির লক্ষ্য অর্জন করবে। এটি কোনও ওয়াইল্ডকার্ড নয়, তবে তথ্য স্কিমার বিপরীতে GROUP_CONCAT সমস্ত কলামের নামের ওয়াইল্ডকার্ডের মতোই দুর্দান্ত।
tbrookside

2
এটি কাজ করতে আমার সমস্যা হচ্ছে। আমি আমার স্কিমা এবং টেবিলের নামগুলির সাথে ডিবি এবং টেবিলটি প্রতিস্থাপন করেছি, প্রকৃত নামের জন্য স্থানধারক হওয়ার জন্য অন্য কিছু আছে কি? এছাড়াও, আমি অভ্যন্তরীণ বিবৃতিটি নিজেই চেষ্টা করে দেখেছি এবং উপলব্ধি করছি যে এটি একটি সারির ডেটার পরিবর্তে কলামের নামগুলি সংযুক্ত করে। আপনি কি এই ইচ্ছা ছিল?
donutguy640

4
সমস্ত যথাযোগ্য সম্মানের সাথে, এটি ভুল। আপনার ক্যোয়ারী কলামগুলির নামগুলির সাথে তাদের মানগুলির সাথে 'মান' তুলনা করবে । আমাকে এটিকে ডাউনটাতে দিতে হবে।
বিল কারভিন

4
আরও সঠিকভাবে, এটি স্ট্রিংটির 'মান' এর সাথে স্ট্রিমের তুলনা করবে যা কলামের নামের সাথে কমা দ্বারা পৃথক করা তালিকা - মূলত একই where 'value' in ('col1,col2,col3…')
অ্যান্ড্রি এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.