2011-03-13 14 views
9

मेरी तालिका में मेरे पास "firstname" और फ़ील्ड "lastname" फ़ील्ड है। मैं उन सभी रिकॉर्ड्स का चयन करना चाहता हूं जहां पहला नाम + स्पेस + अंतिम नाम एक निश्चित मान है।SELECT स्टेटमेंट में दो फ़ील्ड का संयोजन

मैं इस की कोशिश की है:

$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)"; 

लेकिन यह काम नहीं कर रहा। Google के साथ मुझे || का उपयोग करने के बारे में कुछ मिला है, लेकिन मुझे वास्तव में समझ में नहीं आता कि मुझे उस ऑपरेटर का उपयोग कैसे करना चाहिए। ध्यान दें कि मैं एक या ऑपरेटर (क्या || कई भाषाओं में है) का उपयोग नहीं करना चाहता, लेकिन 2 फ़ील्ड (उनके बीच एक जगह के साथ) को संयोजित करने और उस पर एक LIKE का उपयोग करने के लिए कुछ।

धन्यवाद! (जो शून्य मान पर ध्यान नहीं देता)

SELECT * FROM sam_users 
    WHERE CONCAT(user_firstname, ' ', user_lastname) LIKE ? 

या CONCAT_WS:

+4

आरडीबीएमएस क्या है? और आप '=' के बजाय 'LIKE' का उपयोग क्यों कर रहे हैं? –

+0

MySQL, लेकिन मैं पीडीओ लाइब्रेरी (PHP) का उपयोग कर रहा हूं, इसलिए यह पोर्टेबल होना चाहिए। मैं पसंद कर रहा हूं क्योंकि मैं एक "खोज" क्षेत्र बना रहा हूं, इसलिए परिणाम उन सभी उपयोगकर्ताओं की एक सूची होनी चाहिए जिनके नाम दर्ज स्ट्रिंग की तरह हैं। – Bv202

+0

@ बीवी 202 - सुनिश्चित नहीं है कि "सबसे पोर्टेबल" स्ट्रिंग concatenation विधि है या नहीं। अगर किसी भी उत्तर में इसका कवर होता है तो मुझे दिलचस्पी होगी। –

उत्तर

22
MySQL के साथ

, आप CONCAT उपयोग कर सकते हैं

SELECT * FROM sam_users 
    WHERE CONCAT_WS(' ', user_firstname, user_lastname) LIKE ? 

हालांकि, MySQL किसी भी indices उपयोग करने के लिए सक्षम नहीं होगा इस सवाल को करते समय। यदि LIKE पर पैटर्न तर्क का मान वाइल्डकार्ड से शुरू होता है, तो MySQL इंडेक्स का उपयोग करने में सक्षम नहीं होगा, इसलिए जेनरेट किए गए मान (कॉलम के बजाए) की तुलना में कोई फर्क नहीं पड़ता।

स्ट्रिंग concatenation के लिए || ऑपरेटर का उपयोग करने के लिए आप MySQL server SQL mode"ANSI" या "PIPES_AS_CONCAT" पर भी सेट कर सकते हैं।

SET @@sql_mode=CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT'); 
SELECT * FROM sam_users 
    WHERE (user_firstname || ' ' || user_lastname) LIKE ? 

यह केवल वर्तमान session के लिए SQL मोड सेट करता है। प्रत्येक बार कनेक्ट होने पर आपको @@sql_mode सेट करने की आवश्यकता होगी। यदि आप एक सत्र में सेट किए बिना 'PIPES_AS_CONCAT' मोड चाहते हैं:

SET @@sql_mode=REPLACE(@@sql_mode, 'PIPES_AS_CONCAT', ''); 

MySQL @@sql_mode में किसी भी अतिरिक्त अल्पविराम के दूर करने के लिए प्रकट होता है, तो आप उनके बारे में चिंता करने की जरूरत नहीं है।

SELECT * का उपयोग न करें; केवल आपको आवश्यक कॉलम का चयन करें।

+0

ओह ठीक है, रास्ता बहुत आसान है ... किसी भी तरह से मैंने CONCAT कीवर्ड को याद किया होगा ... SELECT * के संबंध में लिंक के लिए धन्यवाद; यह दिलचस्प है :) – Bv202

+0

गिनती (*) का उपयोग करने के बारे में क्या? क्या यह भी एक बुरी चीज है? – Bv202

+1

@ बीवी 202: बिलकुल नहीं। 'COUNT (*)' एक विशेष मामला है। कॉलम स्वयं की मिलान के लिए जांच नहीं की जाती है (हालांकि वे किसी भी अन्य खंड के लिए होंगे), बस मेल खाने वाली पंक्तियां। इस अनुकूलन के बावजूद, एक टेबल परिभाषा को बदलने से 'COUNT (*)' को ऐसे तरीकों से प्रभावित नहीं किया जाएगा जो समस्याएं पैदा करेंगे। – outis

1
SELECT * 
FROM sam_users 
WHERE TRIM(Concat(user_firstname, ' ', user_lastname)) LIKE ?; 
2

एसक्यूएल में || ऑपरेटर मानक के अनुसार मतलब स्ट्रिंग कॉन्सटेनेशन (SQL 2008: 5.2 देखें)। बूलियन या ऑपरेटर को SQL में OR लिखा गया है।

हालांकि सभी डेटाबेस इसे इस तरह कार्यान्वित नहीं करते हैं और इसलिए सटीक वाक्यविन्यास विशिष्ट डेटाबेस पर निर्भर करता है।

  • MySQL सर्वर CONCAT फ़ंक्शन का उपयोग करता है।
  • एमएसएसक्यूएल सर्वर + ऑपरेटर का उपयोग करता है।
संबंधित मुद्दे