दिलचस्प पोस्ट
क्लास के पास कोई शुरुआती स्विफ्ट नहीं है @ManyToMany हाइबरनेट अतिरिक्त तालिका में अतिरिक्त क्षेत्र (एस) जोड़ सकते हैं? एंड्रॉइड में एसडी कार्ड से मैं एक टेक्स्ट फाइल कैसे पढ़ सकता हूं? कैसे <mvc: annotation-driven /> से छुटकारा पाने के लिए? अपाचे httpd (MAMP) में http फ़ाइल कैशिंग को कैसे रोकें हॉवर के साथ बूटस्ट्रैप ड्रॉपडाउन एन्यूम को रिक्त करने के लिए कैसे करें जावा हाइब्रिड – एप्लेट + एप्लिकेशन क्या है? Ggplot2 में स्टैक्ड बार चार्ट पर डेटा मान दिखा रहा है एक्सएमएल में स्ट्रिंग एस्केप जावास्क्रिप्ट और जेस्क्रिप्ट के बीच अंतर क्या है? इकाई फ़्रेमवर्क: एक डाटाबेस, एकाधिक डीबीसीटीएक्सट्स क्या यह एक बुरा विचार है? एजेक्स के लिए टाइमआउट सेट करें (jQuery) AngularJS: त्रुटि रोकें $ $ पहले से ही प्रगति पर है जब $ दायरे को कॉल करते हैं। $ लागू होते हैं () एंड्रॉइड स्टूडियो ग्रेडल मुद्दे को संस्करण 0.5.0 में अपग्रेड कर रहा है – 0.8 से 0.9 तक स्थानांतरित करने वाले ग्रैडल – एंड्रॉइड स्टूडियो 0.8.1 में अपग्रेड

क्या एसक्यूएल में "पसंद" और "इन" का एक संयोजन है?

एसक्यूएल I में (दुख की बात है) अक्सर सामान्य होने के लगभग हर नियम का उल्लंघन करने वाले डेटाबेस के कारण " LIKE " शर्तों का उपयोग करना पड़ता है। मैं अभी इसे बदल नहीं सकता। लेकिन सवाल के लिए यह अप्रासंगिक है।

इसके अलावा, मैं अक्सर अपनी एसक्यूएल स्टेटमेंट की बेहतर पठनीयता और लचीलेपन के लिए WHERE something in (1,1,2,3,5,8,13,21) , 1, 2, 3, 5, 8, 13, WHERE something in (1,1,2,3,5,8,13,21) परिस्थितियों का उपयोग करता हूं।

क्या जटिल उप-चुनावों को लिखे बिना इन दोनों चीजों को जोड़ना संभव है?

मुझे कुछ के समान आसान होना चाहिए WHERE something LIKE ('bla%', '%foo%', 'batz%')

 WHERE something LIKE 'bla%' OR something LIKE '%foo%' OR something LIKE 'batz%' 

मैं यहां एसक्यूएल सर्वर और ओरेकल के साथ काम कर रहा हूं, लेकिन मुझे कोई दिलचस्पी है अगर यह किसी RDBMS में संभव है।

वेब के समाधान से एकत्रित समाधान "क्या एसक्यूएल में "पसंद" और "इन" का एक संयोजन है?"

एसक्यूएल में पसंद की कोई भी संयोजन नहीं है, टीएसक्यूएल (एसक्यूएल सर्वर) या पीएलएसक्यूएल (ओरेकल) में बहुत कम है। इसके लिए कारण का एक हिस्सा है क्योंकि पूर्ण पाठ खोज (एफटीएस) अनुशंसित विकल्प है

दोनों ओरेकल और एसक्यूएल सर्वर एफटीएस के कार्यान्वयन में कंटेंट का समर्थन होता है, लेकिन सिंटैक्स अभी भी थोड़ा अलग है:

आकाशवाणी:

 WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0 

एस क्यू एल सर्वर:

 WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"') 

संदर्भ:

  • ओरेकल टेक्स्ट के साथ पूर्ण-टेक्स्ट खोज एप्लिकेशन का निर्माण करना
  • SQL सर्वर पूर्ण-पाठ को समझना

यदि आप अपना कथन आसानी से पठनीय बनाने के लिए चाहते हैं, तो आप REGEXP_LIKE का उपयोग कर सकते हैं (ओरेकल संस्करण 10 से उपलब्ध है)।

एक उदाहरण सारणी:

 SQL> create table mytable (something) 2 as 3 select 'blabla' from dual union all 4 select 'notbla' from dual union all 5 select 'ofooof' from dual union all 6 select 'ofofof' from dual union all 7 select 'batzzz' from dual 8 / Table created. 

मूल वाक्यविन्यास:

 SQL> select something 2 from mytable 3 where something like 'bla%' 4 or something like '%foo%' 5 or something like 'batz%' 6 / SOMETH ------ blabla ofooof batzzz 3 rows selected. 

और REGEXP_LIKE के साथ एक सरल लग रही क्वेरी

 SQL> select something 2 from mytable 3 where regexp_like (something,'^bla|foo|^batz') 4 / SOMETH ------ blabla ofooof batzzz 3 rows selected. 

परंतु …

बहुत अच्छा प्रदर्शन के कारण मैं इसे खुद नहीं सुझाऊंगा मैं कई तरह के साथ रहना होगा predicates तो उदाहरण मजेदार थे।

आप के साथ फंस रहे हैं

 WHERE something LIKE 'bla%' OR something LIKE '%foo%' OR something LIKE 'batz%' 

जब तक आप एक अस्थायी तालिका (डेटा के साथ वाइल्ड कार्ड शामिल करें) को आबाद करें और इस तरह जुड़ें:

 FROM YourTable y INNER JOIN YourTempTable t On y.something LIKE t.something 

इसे आज़माएं (SQL सर्वर सिंटैक्स का उपयोग कर):

 declare @x table (x varchar(10)) declare @y table (y varchar(10)) insert @x values ('abcdefg') insert @x values ('abc') insert @x values ('mnop') insert @y values ('%abc%') insert @y values ('%b%') select distinct * FROM @xx WHERE xx LIKE '%abc%' or xx LIKE '%b%' select distinct x.* FROM @xx INNER JOIN @yy On xx LIKE yy 

उत्पादन:

 x ---------- abcdefg abc (2 row(s) affected) x ---------- abc abcdefg (2 row(s) affected) 

PostgreSQL के साथ ANY या ALL फॉर्म है:

 WHERE col LIKE ANY( subselect ) 

या

 WHERE col LIKE ALL( subselect ) 

जहां सबसेएक्ट डेटा के एक स्तंभ को ठीक से देता है

मैं तालिकावेल उपयोगकर्ता फ़ंक्शन का उपयोग करने का सुझाव देता हूं यदि आप ऊपर दिखाए गए इनर जॉइन या अस्थायी तालिका तकनीकों को शामिल करना चाहते हैं। इससे इसे थोड़ा और अधिक स्पष्ट रूप से पढ़ने की अनुमति मिल जाएगी।

विभाजित समारोह का उपयोग करने के बाद: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

हम "फिश" नामक एक मेज पर आधारित निम्नलिखित लिख सकते हैं (इंट आईडी, वर्चार (50) नाम)

 SELECT Fish.* from Fish JOIN dbo.Split('%ass,%e%',',') as Splits on Name like Splits.items //items is the name of the output column from the split function. 

आउटपुट

 1 बास
 2 पाइक
 7 एंग्लर
 8 वालली

एक दृष्टिकोण शर्तों को एक अस्थायी तालिका (या SQL सर्वर में तालिका चर) में संग्रहीत करने के लिए होगा और इस तरह से जुड़ें:

 SELECT t.SomeField FROM YourTable t JOIN #TempTableWithConditions c ON t.something LIKE c.ConditionValue 

इसके बजाय एक आंतरिक शामिल का उपयोग करें:

 SELECT ... FROM SomeTable JOIN (SELECT 'bla%' AS Pattern UNION ALL SELECT '%foo%' UNION ALL SELECT 'batz%' UNION ALL SELECT 'abc' ) AS Patterns ON SomeTable.SomeColumn LIKE Patterns.Pattern 

आप यह भी कोशिश कर सकते हैं

समारोह

 CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20)) RETURNS @Strings TABLE ( position int IDENTITY PRIMARY KEY, value varchar(8000) ) AS BEGIN DECLARE @index int SET @index = -1 WHILE (LEN(@text) > 0) BEGIN SET @index = CHARINDEX(@delimiter , @text) IF (@index = 0) AND (LEN(@text) > 0) BEGIN INSERT INTO @Strings VALUES (@text) BREAK END IF (@index > 1) BEGIN INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) SET @text = RIGHT(@text, (LEN(@text) - @index)) END ELSE SET @text = RIGHT(@text, (LEN(@text) - @index)) END RETURN END 

सवाल

 select * from my_table inner join (select value from fn_split('ABC,MOP',',')) as split_table on my_table.column_name like '%'+split_table.value+'%'; 

एक अन्य समाधान, किसी RDBMS पर काम करना चाहिए:

 WHERE EXISTS (SELECT 1 FROM (SELECT 'bla%' pattern FROM dual UNION ALL SELECT '%foo%' FROM dual UNION ALL SELECT 'batz%' FROM dual) WHERE something LIKE pattern) 

एसक्यूएल सर्वर के लिए आप डायनामिक एसक्यूएल का सहारा ले सकते हैं

इस तरह की स्थितियों में अधिकांश समय आपके डेटाबेस में से कुछ डेटा के आधार पर IN खंड का पैरामीटर है।

नीचे दिया गया उदाहरण थोड़ा "मजबूर" है, लेकिन यह विरासत डेटाबेस में पाए जाने वाले विभिन्न वास्तविक मामलों से मेल खा सकता है।

मान लीजिए आपके पास टेबल है व्यक्तियों, जहां व्यक्ति नाम एक फ़ील्ड में फ़ील्ड में नामांकित हैं FirstName + '' + LastName के रूप में आपको पहले नामों की सूची से सभी व्यक्तियों को चुनने की जरूरत है, फ़ील्ड में नामित करेंटैब नामों में चयन करेंजो चयन करें , प्लस कुछ अतिरिक्त मापदंड (जैसे लिंग, जन्म तिथि, आदि पर फ़िल्टर्ड)

आप निम्नानुसार ऐसा कर सकते हैं

 -- @gender is nchar(1), @birthDate is date declare @sql nvarchar(MAX), @subWhere nvarchar(MAX) @params nvarchar(MAX) -- prepare the where sub-clause to cover LIKE IN (...) -- it will actually generate where clause PersonName Like 'param1%' or PersonName Like 'param2%' or ... set @subWhere = STUFF( ( SELECT ' OR PersonName like ''' + [NameToSelect] + '%''' FROM [NamesToSelect] t FOR XML PATH('') ), 1, 4, '') -- create the dynamic SQL set @sql ='select PersonName ,Gender ,BirstDate -- and other field here from [Persons] where Gender = @gender AND BirthDate = @birthDate AND (' + @subWhere + ')' set @params = ' @gender nchar(1), @birthDate Date' EXECUTE sp_executesql @sql, @params, @gender, @birthDate 

मेरे पास इस के लिए एक समाधान हो सकता है, हालांकि यह केवल SQL Server 2008 में ही काम करेगा जहां तक ​​मुझे पता है। मुझे पता चला कि आप एक समान खंड का उपयोग करके एक 'काल्पनिक' तालिका में शामिल होने के लिए https://stackoverflow.com/a/7285095/894974 में वर्णित पंक्ति-कन्स्ट्रक्टर का उपयोग कर सकते हैं। यह और अधिक जटिल लगता है तो यह है, देखो:

 SELECT [name] ,[userID] ,[name] ,[town] ,[email] FROM usr join (values ('hotmail'),('gmail'),('live')) as myTable(myColumn) on email like '%'+myTable.myColumn+'%' 

इससे सभी उपयोगकर्ताओं को सूची में प्रदान किए गए ई-मेल एड्रेस जैसे परिणाम मिलेंगे। आशा है कि यह किसी के लिए उपयोग की है समस्या थोड़ी देर मुझे परेशान कर रही थी

यदि आप MySQL का उपयोग कर रहे हैं तो आप सबसे निकटतम पूर्ण पाठ खोज पा सकते हैं:

पूर्ण पाठ खोज, MySQL प्रलेखन

यह कॉमा से अलग किए गए मानों के लिए काम करता है

 DECLARE @ARC_CHECKNUM VARCHAR(MAX) SET @ARC_CHECKNUM = 'ABC,135,MED,ASFSDFSF,AXX' SELECT ' AND (a.arc_checknum LIKE ''%' + REPLACE(@arc_checknum,',','%'' OR a.arc_checknum LIKE ''%') + '%'')'' 

का मूल्यांकन:

  AND (a.arc_checknum LIKE '%ABC%' OR a.arc_checknum LIKE '%135%' OR a.arc_checknum LIKE '%MED%' OR a.arc_checknum LIKE '%ASFSDFSF%' OR a.arc_checknum LIKE '%AXX%') 

यदि आप इसे इंडेक्स का उपयोग करना चाहते हैं, तो आपको पहले '%' वर्ण को छोड़ना होगा।

मैं भी ऐसा कुछ के लिए सोच रहा था मैंने सिर्फ SUBSTRING और IN संयोजन का परीक्षण किया और यह इस तरह की समस्या का एक प्रभावी समाधान है। नीचे दिए गए प्रश्नों को आज़माएं:

 Select * from TB_YOUR T1 Where SUBSTRING(T1.Something, 1,3) IN ('bla', 'foo', 'batz') 

ओरेकल में आप निम्न तरीके से संग्रह का उपयोग कर सकते हैं:

 WHERE EXISTS (SELECT 1 FROM TABLE(ku$_vcnt('bla%', '%foo%', 'batz%')) WHERE something LIKE column_value) 

यहां मैंने एक पूर्वनिर्धारित संग्रह प्रकार ku$_vcnt , लेकिन आप इस तरह अपनी खुद की घोषणा कर सकते हैं:

 CREATE TYPE my_collection AS TABLE OF VARCHAR2(4000); 

मेरे पास एक सरल समाधान है, जो कम से कम postgresql में काम करता है, regex की सूची के like any का उपयोग कर। यहां एक उदाहरण है, कुछ एंटीबायोटिक्स को एक सूची में पहचानने के लिए:

 select * from database.table where lower(drug_name) like any ('{%cillin%,%cyclin%,%xacin%,%mycine%,%cephal%}') 

ओरेकल आरबीडीएमएस में आप REGEXP_LIKE फ़ंक्शन का उपयोग करके इस व्यवहार को प्राप्त कर सकते हैं।

निम्न कोड परीक्षण करेगा यदि स्ट्रिंग तीन सूची अभिव्यक्ति में मौजूद है | दो | तीन | चार | पांच (जिसमें पाइप " | " प्रतीक का अर्थ है या तर्क ऑपरेशन)।

 SELECT 'Success !!!' result FROM dual WHERE REGEXP_LIKE('three', 'one|two|three|four|five'); RESULT --------------------------------- Success !!! 1 row selected. 

पूर्ववर्ती अभिव्यक्ति के बराबर है:

 three=one OR three=two OR three=three OR three=four OR three=five 

तो यह सफल होगा

दूसरी ओर, निम्नलिखित परीक्षण विफल हो जाएगा।

 SELECT 'Success !!!' result FROM dual WHERE REGEXP_LIKE('ten', 'one|two|three|four|five'); no rows selected 

नियमित अभिव्यक्ति (आरजीईएक्सएपी_ *) से संबंधित कई कार्य हैं जो ओरेकल में 10 जी संस्करण से उपलब्ध हैं। यदि आप एक ओरेकल डेवलपर हैं और इस विषय को रुचि रखते हैं तो यह ओरेकल डाटाबेस के साथ नियमित अभिव्यक्ति का उपयोग करना अच्छी शुरुआत होगी।

इस तरह कोई जवाब नहीं:

 SELECT * FROM table WHERE something LIKE ('bla% %foo% batz%') 

ओरेकल में कोई समस्या नहीं है

यह करो

 WHERE something + '%' in ('bla', 'foo', 'batz') OR '%' + something + '%' in ('tra', 'la', 'la') 

या

 WHERE something + '%' in (select col from table where ....)