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




sql-server oracle tsql plsql (17)

मेरे पास इसका समाधान हो सकता है, हालांकि यह केवल SQL सर्वर 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+'%' 

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

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

इसके अलावा, मैं अक्सर अपने एसक्यूएल स्टेटमेंट की बेहतर पठनीयता और लचीलापन के लिए 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%'

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


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

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

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

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

यह करो

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

या

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

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

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

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

स्प्लिट फ़ंक्शन का उपयोग करने के बाद: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

हम "मछली" नामक एक टेबल के आधार पर निम्नलिखित लिख सकते हैं (int id, varchar (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   Bass
2   Pike
7   Angler
8   Walleye

यदि आप अपना कथन आसानी से पठनीय बनाना चाहते हैं, तो आप 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.

परंतु ...

अच्छा प्रदर्शन के कारण मैं इसे स्वयं अनुशंसा नहीं करता। मैं कई तरह की भविष्यवाणी के साथ रहना होगा। तो उदाहरण सिर्फ मस्ती के लिए थे।


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


एक और समाधान, किसी भी आरडीबीएमएस पर काम करना चाहिए:

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)

यह अल्पविराम से अलग मूल्यों के लिए काम करता है

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

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

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


आप के साथ अटक गए हैं

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 @x x
WHERE x.x LIKE '%abc%' 
   or x.x LIKE '%b%'


select distinct x.*  
FROM @x             x
    INNER JOIN  @y  y On x.x LIKE y.y

उत्पादन:

x
----------
abcdefg
abc

(2 row(s) affected)

x
----------
abc
abcdefg

(2 row(s) affected)

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

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

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


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

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

आकाशवाणी:

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

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

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

संदर्भ:


SQL डेटाबेस में ININER जॉइन के साथ चयन से अद्यतन करें

चूंकि इस पोस्ट के बहुत सारे जवाब हैं, जो सबसे ज्यादा वोट-अप हैं, मैंने सोचा कि मैं यहां भी अपना सुझाव प्रदान करूंगा। हालांकि सवाल बहुत दिलचस्प है, मैंने कई फोरम साइटों में देखा है और स्क्रीनशॉट के साथ इनर जॉइन का उपयोग करके समाधान बनाया है।

सबसे पहले, मैंने स्कूली लोगों के साथ नामित एक टेबल बनाई है और उनके कॉलम नामों के संबंध में कुछ रिकॉर्ड डाले हैं और इसे निष्पादित किया है।

फिर मैंने सम्मिलित रिकॉर्ड्स देखने के लिए SELECT कमांड निष्पादित किया।

तब मैंने स्कूली नई नाम की एक नई टेबल बनाई और इसी तरह उपरोक्त कार्यों को निष्पादित किया।

फिर, इसमें सम्मिलित रिकॉर्ड्स देखने के लिए, मैं SELECT कमांड निष्पादित करता हूं।

अब, मैं इस क्रिया को पूरा करने के लिए तीसरे और चौथे पंक्ति में कुछ बदलाव करना चाहता हूं, मैं इनर जॉइन के साथ अद्यतन आदेश निष्पादित करता हूं।

परिवर्तनों को देखने के लिए मैं SELECT कमांड निष्पादित करता हूं।

आप देख सकते हैं कि टेबल स्कूलील्ड के तीसरे और चौथे रिकॉर्ड आसानी से तालिका स्कूल के साथ बदलकर अपडेट स्टेटमेंट के साथ INNER जॉइन का उपयोग करके कैसे बदल सकते हैं।





sql sql-server oracle tsql plsql