MySQL - सभी कॉलम में एक मान की जाँच कैसे करें


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

आपको इसे दो चरणों में करने की आवश्यकता है, पहले sql उत्पन्न करें जैसे (मान लें कि आपकी तालिका को स्कीमा S में T नाम दिया गया है:

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');

अब आप इस स्ट्रिंग को निष्पादित कर सकते हैं। ध्यान दें कि आपको 'a' को एक्स्ट्रा के साथ कोट करना है। यदि आप इसे उदाहरण के लिए एक प्रक्रिया में रखते हैं, तो आप उस स्ट्रिंग को तैयार और निष्पादित कर सकते हैं जो उत्पन्न हुई थी।

मैंने इसके साथ परीक्षण किया:

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

ऐसा लगता है कि यह पूछे जाने के बाद से एक साल हो गया है, लेकिन मैं सिर्फ उस चीज़ पर ठोकर खाई है जो मुझे लग रही थी, वही सटीक प्रतीत होती है! यह एक एसक्यूएल स्टेटमेंट नहीं है, जैसे मैं अनुमान लगा रहा था, लेकिन यह वही है जो मैं चाहता था।

MySQL कार्यक्षेत्र में, आप तालिका या स्कीमा पर राइट क्लिक कर सकते हैं और खोज तालिका डेटा चुन सकते हैं।स्कीमा संदर्भ मेनू


0

इसको आजमाओ:

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

यह मानता है कि .आपकी खोज स्ट्रिंग में कोई भी नहीं है। यदि आप इसकी गारंटी नहीं दे सकते हैं, तो शायद आप एक अलग "विभाजक चरित्र" का उपयोग कर सकते हैं।


1
क्या आप बता सकते हैं कि आपका समाधान क्यों काम करता है? कोड केवल उत्तरों को एक अच्छे उत्तर के रूप में नहीं देखा जाता है।
जॉर्ज.पलासियोस

यह काम नहीं करता है। जैसे कि अगर टी सर्च में %या _किसी कॉलम में .
सम्‍मिलित है

1
@ जासेन आप विशेष पात्रों से बच सकते हैं और एक अलग विभाजक का उपयोग कर सकते हैं।
अनोन ००१२३

@ George.Palacios - ऐसा क्या है जो आपको अस्पष्ट लगता है?
अनोन ००१२३

सही विभाजक चुनना बहुत मुश्किल हो सकता है। यह दृष्टिकोण सही करने के लिए बहुत कठिन है
जेसेन

0

सबसे सरल उपाय कर रहा है

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

जब तक कि घाटी कुछ ऐसा न हो कि sql सिंटैक्स में एक सामान्य घटना है।


मुझे आशा है कि आप मेरा मजाक उड़ा रहे हैं, जैसा कि विकल्प है कि आपको लगा कि यह मददगार होगा।
donutguy640

1
मैं निश्चित रूप से नहीं हूं। यह कुछ खोजने का एक वैध तरीका है यदि आप नहीं जानते हैं कि "कहाँ" यह db / तालिका में है। Grep संपूर्ण पंक्तियों (तालिका नाम सहित) को लौटाएगा जहाँ मान मौजूद है। यह SQL नहीं है और यह बहुत उपयोगी नहीं है यदि आप आउटपुट को प्रोग्रामेटिक रूप से प्रोसेस करना चाहते हैं, लेकिन यह सरल और काफी तेज है।
javavalik

-2

इसे इस्तेमाल करे।

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

CONCAT () का उपयोग स्तंभ मानों को अलग करने के लिए किया जाता है जैसे कि आप फ़ंक्शन के अंदर बेहतर परिणाम को निर्दिष्ट करने के लिए अपने कॉलम को अंतरिक्ष के साथ अलग कर सकते हैं और मान को अंतरिक्ष के साथ अलग स्ट्रिंग भी जांच सकते हैं और परिणाम आपके हाथ में है।


-3

यह info_schema डेटाबेस का उपयोग करके संभव है, हम मूल रूप से एक विशिष्ट तालिका के सभी स्तंभों को सूचीबद्ध करेंगे, फिर उन्हें एक पंक्ति के रूप में सूचीबद्ध करने के लिए 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? इसके अलावा, आप स्ट्रिंग प्रकारों के लिए एक विधेय जोड़ सकते हैं जैसे: `और DATA_TYPE IN ('char', 'varchar')`
Lennart

1
यह यह करेगा, और कॉलम के नामकरण से बचने के ओपी के लक्ष्य को पूरा करता है। यह वाइल्डकार्ड नहीं है, लेकिन सूचना स्कीमा के खिलाफ GROUP_CONCAT सभी कॉलम नामों के वाइल्डकार्ड के रूप में अच्छा है।
ट्रोबोकसाइड

2
मुझे काम करने में दिक्कत हो रही है। मैंने अपने स्कीमा और टेबल नामों के साथ db और टेबल को बदल दिया है, क्या वास्तविक नामों के लिए प्लेसहोल्डर होने के लिए कुछ और है? इसके अलावा, मैंने अपने स्वयं के आंतरिक विवरण की कोशिश की, और यह महसूस कर रहा हूं कि यह एक पंक्ति के डेटा के बजाय कॉलम नामों को जोड़ता है। क्या आपने जो इरादा किया था?
donutguy640

4
सभी उचित सम्मान के साथ, यह गलत है। आपकी क्वेरी कॉलम के नामों से 'मूल्य' की तुलना करेगी , उनकी सामग्री से नहीं । मुझे इसे नीचे देना होगा।
बिल करविन

4
अधिक सटीक रूप से, यह स्ट्रिंग 'मान' की तुलना उस स्ट्रिंग से करेगा जो स्तंभ नामों की अल्पविराम से अलग की गई सूची है - अनिवार्य रूप से समान where 'value' in ('col1,col2,col3…')
एंड्री एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.