2014-04-27 10 views
30

तो मैं अपने Postgresql में एक है, तो:Postgresql चयन स्ट्रिंग

TAG_TABLE 
========================== 
id   tag_name  
-------------------------- 
1    aaa 
2    bbb 
3    ccc 

मेरी समस्या को आसान बनाने के लिए, मुझे क्या करना चाहते हैं का चयन TAG_TABLE से 'आईडी' है जब एक स्ट्रिंग "aaaaaaaa" शामिल हैं ' टैग नाम'। तो आदर्श है, यह केवल लौटना चाहिए "1", जो टैग नाम 'एएए' के ​​लिए आईडी है

यह मैं अब तक क्या कर रहा हूँ है:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%' 

लेकिन जाहिर है, यह काम नहीं करता, चूंकि पोस्टग्रेर्स सोचते हैं कि '% tag_name%' का अर्थ उस कॉलम के अंतर्गत वास्तविक डेटा मान के बजाय सबस्ट्रिंग 'tag_name' वाला पैटर्न है।

मैं टैग_नाम पैटर्न में कैसे पास करूं ??

उत्तर

44

आपको उद्धरण के बाहर 'tag_name' का उपयोग करना चाहिए; फिर इसे रिकॉर्ड के क्षेत्र के रूप में व्याख्या किया गया। '||' का उपयोग करके संगत शाब्दिक प्रतिशत संकेतों के साथ:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%'; 
+1

टैग_नाम होने पर क्या hapoens है;" ड्रॉप तालिका TAG_TABLE; - "'? –

+11

@ डेनिस: कुछ भी नहीं होता है। आपको कोई पंक्ति नहीं मिलती है, क्योंकि 'WHERE' क्लॉज 'FALSE' का मूल्यांकन करता है। कथन गतिशील नहीं है, केवल मानों को समेकित किया जाता है, एसक्यूएल इंजेक्शन के लिए कोई मौका नहीं है। –

+1

aaaa का आदेश नहीं होना चाहिए और tag_name उलट दिया जाना चाहिए? मेरा मतलब है कि आपको – user151496

17

मैं व्यक्तिगत रूप से ~ ऑपरेटर के सरल वाक्यविन्यास को प्राथमिकता देता हूं।

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name; 

अंतर को समझने के लिए Difference between LIKE and ~ in Postgres के माध्यम से पढ़ने योग्य मूल्य। `

+0

यह केवल तभी काम करता है जब 'tag_name' उचित REGEX है। बहुत जोखिम भरा –