এসকিউএলে "লাইক" এবং "ইন" এর সংমিশ্রণটি রয়েছে?


340

এসকিউএল-এ প্রথম (দুঃখের সাথে) প্রায়শই " 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%'

আমি এখানে এসকিউএল সার্ভার এবং ওরাকল নিয়ে কাজ করছি তবে আমি আগ্রহী যদি এটি কোনও আরডিবিএমএসে সম্ভব হয় তবে।


1
আপনার করতে হবে এবং পছন্দ করতে হবে বা: এবং (কিছু '%'%% পছন্দ 'বা কিছু'% জিনিস% 'বা কিছু'% জিনিস% 'পছন্দ)
কসমিক হক

আমি চাই আমরা টেরাদাতার like any/ like all: স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / 40475982 / sql-like-any-vs- Like- সমস্ত থাকি । (রেকর্ডের জন্য, এটি ওরাকল কমিউনিটি আইডিয়াস ফোরাম কমিউনিটি.অরাকল.
উইলিয়াম রবার্টসন

উত্তর:


196

এসকিউএলে LIKE & IN এর কোনও সংমিশ্রণ নেই, টিএসকিউএল (এসকিউএল সার্ভার) বা পিএলএসকিউএল (ওরাকল) এর চেয়ে অনেক কম। এর কারণের একটি অংশ হ'ল ফুল পাঠ্য অনুসন্ধান (এফটিএস) প্রস্তাবিত বিকল্প।

ওরাকল এবং এসকিউএল সার্ভার উভয়ই এফটিএস বাস্তবায়নগুলি কন্টেইন কীওয়ার্ডকে সমর্থন করে তবে বাক্য গঠনটি এখনও কিছুটা পৃথক:

ওরাকল:

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

SQL সার্ভার:

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

আপনি যে কলামটি জিজ্ঞাসা করছেন তা অবশ্যই পূর্ণ-পাঠ্য ইনডেক্সড।

রেফারেন্স:


11
হাই, ওরাকল দিয়ে, আপনি যে কলামগুলিতে "CONTAINS" অপারেটর প্রয়োগ করতে চান তাতে প্লেইনটেক্সট সূচি তৈরি করতে হবে। আপনার ডেটা ভলিউমের উপর নির্ভর করে এটি বেশ দীর্ঘ হতে পারে।
পিয়েরে-গিলস লেভাল্লোইস

18
এসকিউএল সার্ভারের সাথে (কমপক্ষে ২০০৮ সংস্করণ) @ পিলুজের মন্তব্যটিও প্রযোজ্য, আপনাকে পূর্ণ পাঠ্য সূচি তৈরি করতে হবে।
মার্সেল

সর্বোচ্চ দৈর্ঘ্য 4000.
ᴍᴀᴛᴛ

59

আপনি যদি আপনার বিবৃতিটি সহজেই পঠনযোগ্য করে তুলতে চান তবে আপনি 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.

কিন্তু ...

খুব ভাল-না পারফরম্যান্সের কারণে আমি এটি নিজেই প্রস্তাব দেব না। আমি বিভিন্ন লাইক পূর্বাভাসের সাথে লেগে থাকি। সুতরাং উদাহরণগুলি কেবল মজাদার জন্য ছিল।


4
10 জি-তে REGEXP ব্যবহারের দুর্দান্ত চিত্রণ। আমি কৌতূহলী, যদিও, যদি পারফরম্যান্স আসলেই আরও খারাপ হয়। উভয়েরই পুরো টেবিল এবং / অথবা সূচি স্ক্যানগুলির প্রয়োজন হবে, না?
ডিসিকি

12
সত্য। তবে নিয়মিত প্রকাশগুলি সিপিইউটিকে পাগলের মতো পোড়ায়, আই / ও নয়। যদি এটি আরও খারাপ হয় এবং এটি কতটা খারাপ, আপনার এক্সপ্রেশনগুলির তালিকাটি কত বড় এবং কলামটি অন্যের মধ্যে সূচকযুক্ত কিনা তা নির্ভর করে। এটি কেবল একটি সতর্কতা, যাতে তিনি যখন এটি প্রয়োগ শুরু করেন তখন মূল পোস্টারটি অবাক হয় না।
রব ভ্যান উইজক

49

আপনি আটকে আছেন

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

এটি ব্যবহার করে দেখুন (এসকিউএল সার্ভার সিনট্যাক্স ব্যবহার করে):

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)

ঠিক আছে, এটি কার্যকর হবে, তবে এসকিউএল স্টেটমেন্টটিকে আরও সহজে পাঠযোগ্য করে তোলার লক্ষ্যে আমার উদ্দেশ্য হয় না :)
স্বাওয়ারেসুপ

10
এসকিউএল-তে আপনি সূচকের ব্যবহার এবং কার্য সম্পাদনের জন্য যান। কেবলমাত্র এসকিউএল পাঠযোগ্যতার জন্য ইনডেন্টিং এবং নামকরণ ব্যবহার করুন, আপনি যখন পঠনযোগ্যতার জন্য অন্যান্য পরিবর্তন করেন কেবল তখনই আপনি সম্পাদন পরিকল্পনা পরিবর্তন করতে পারেন (যা সূচকের ব্যবহার এবং কার্য সম্পাদনকে প্রভাবিত করে)। আপনি যদি সতর্ক না হন তবে তুচ্ছ তাত্পর্যপূর্ণ পরিবর্তন করে খুব সহজেই তাত্ক্ষণিকভাবে চলমান ক্যোয়ারিকে খুব ধীর গতিতে পরিবর্তন করতে পারেন।
কেএম

এই উত্তরের প্রথম বিবৃতিটি কী - (সর্বাধিক?) এসকিউএল-ভিত্তিক সিস্টেম এবং ভাষাগুলি আপনি যা চান তা সমর্থন করে না, কাজের আশপাশ বাস্তবায়ন না করেই। (এসকিউএল সার্ভারে, সম্পূর্ণ পাঠ্য সূচিকরণে সহায়তা করবে?)
ফিলিপ কেলি

ফিলিপ কেলি, এসকিউএল সার্ভারের সম্পূর্ণ পাঠ্য সূচী কী করতে পারে, ওপির উদাহরণ কোডটিতে কোনটি LIKE 'bla%' ? বা কেবল LIKE '%bla%'অনুসন্ধান করতে পারে ?
কেএম

আমি সত্যই জানি না, আমি কখনও এফটি সূচক ব্যবহার করি নি। আমি ইতিমধ্যে পণ্যটিতে অন্তর্ভুক্ত একটি সম্ভাব্য কাজের আশেপাশের নমুনা হিসাবে এটি টস করেছি। তিনি কী করছেন (এ বা বি বা সি) এর জন্য, আমি সন্দেহ করি যে এটি এটি করে না, মোটামুটি আত্মবিশ্বাস রয়েছে যে এটি নির্ধারণ করতে অনেক প্রচেষ্টা নেওয়া হবে, এবং জেনে রাখুন যে এটি তার মূল প্রশ্নের পরিসীমা বাইরে (না এসকিউএল এটি স্থানীয়ভাবে করুন)।
ফিলিপ কেলি

20

PostgreSQL এর সাথে এখানে ANYবা ALLফর্মটি রয়েছে:

WHERE col LIKE ANY( subselect )

অথবা

WHERE col LIKE ALL( subselect )

যেখানে সাবট্রাক্ট ডেটাগুলির এক এক কলাম দেয়।


1
হয় LIKE ANYএবং LIKE ALLকোর ভাষা, অথবা একটি উপভাষা নির্দিষ্ট অর্থাৎ অংশ সব এসকিউএল উপভাষা সাধারণ?
আসাদ ইব্রাহিম

1
@ আসাদ এব্রাহিম, তারা নির্দিষ্ট নয়। ওরাকল এর রয়েছে = ANYবা <> ALLকিন্তু এটি কেবল এসকিউএল তে কাজ করে, উদাহরণস্বরূপ পিএলএসকিউএলে নয়।
বেনোইট

আমি মনে করি এটি স্ট্যান্ডার্ড সিনট্যাক্স (তবে অনেকগুলি ডিবিএমএস এটি প্রয়োগ করে না)
ypercubeᵀᴹ


13

আর একটি সমাধান, যে কোনও আরডিবিএমএসে কাজ করা উচিত:

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)

1
তবে এটি ওআর-এর বিবৃতিগুলির একটি সেটের চেয়ে কুশল
Fandango68

1
@ ফানডাঙ্গো 68৮, তবে বাছাইয়ের ইউনিয়নটিকে অন্য কোনও উত্সের মতো টেবিল, একটি দৃশ্য ইত্যাদির দ্বারা প্রতিস্থাপন করা যেতে পারে
মিক

10

আমি যদি আপনি উপরে দেখানো অভ্যন্তরীণ যোগদান বা টেম্প টেবিলের কৌশলগুলি encapsulate করতে চান তবে একটি টেবিলওয়ালু ব্যবহারকারী ফাংশনটি ব্যবহার করার পরামর্শ দেব। এটি এটিকে আরও কিছুটা স্পষ্টভাবে পড়তে দেবে।

: বিভক্ত ফাংশন ব্যবহার করে পরে এ সংজ্ঞায়িত 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 ওয়াল্লি

1
একবারে অনেকগুলি শর্তের সাথে মিলে গেলে একটি সারি নকল করা হবে।
মিক

7

একটি পদ্ধতির শর্তগুলি কোনও টেম্প টেবিলের (বা এসকিউএল সার্ভারে টেবিল ভেরিয়েবল) সংরক্ষণ করা এবং এটির সাথে এতে যুক্ত হতে হবে:

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

একবারে অনেকগুলি শর্তের সাথে মিলে গেলে একটি সারি নকল করা হবে।
mik

7

পরিবর্তে একটি অভ্যন্তরীণ যোগদান ব্যবহার করুন:

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

1
ঠিক আছে, আমি ঠিক এড়াতে চাই। যদিও এটি কাজ করে।
স্বাওয়ারেসৌপ

কেন এই সমাধান এড়ানো? এটি গ্রহণযোগ্য সমাধান হিসাবে তত দ্রুত কাজ করে এবং ঠিক তেমনি বহুমুখী is
ফিল ফ্যাক্টর

3
@ ফিলফ্যাক্টর এই সমাধানটি সদৃশ সারি তৈরি করতে পারে।
জাকুব কানিয়া

5

আমি এখানে এসকিউএল সার্ভার এবং ওরাকল নিয়ে কাজ করছি তবে আমি আগ্রহী যদি এটি কোনও আরডিবিএমএসে সম্ভব হয় তবে।

টেরাদাতা সমস্ত / যেকোন সিনট্যাক্সের মতো সমর্থন করে :

তালিকার সমস্ত স্ট্রিং। তালিকার
যে কোনও স্ট্রিং।

┌──────────────────────────────┬────────────────────────────────────┐
      THIS expression         IS equivalent to this expression  
├──────────────────────────────┼────────────────────────────────────┤
 x LIKE ALL ('A%','%B','%C%')  x LIKE 'A%'                        
                               AND x LIKE '%B'                    
                               AND x LIKE '%C%'                   
                                                                  
 x LIKE ANY ('A%','%B','%C%')  x LIKE 'A%'                        
                               OR x LIKE '%B'                     
                               OR x LIKE '%C%'                    
└──────────────────────────────┴────────────────────────────────────┘

সম্পাদনা করুন:

jOOQ সংস্করণ 3.12.0 সেই বাক্য গঠনটিকে সমর্থন করে:

সিন্থেটিক যুক্ত করুন [নয়] যে কোনওটিকে পছন্দ করুন এবং [না] সমস্ত অপারেটরকে পছন্দ করুন

অনেক সময়, এসকিউএল ব্যবহারকারীরা লাইক এবং ইন পূর্বাভাসগুলি একত্রিত করতে সক্ষম হতে চান:

SELECT *
FROM customer
WHERE last_name [ NOT ] LIKE ANY ('A%', 'E%') [ ESCAPE '!' ]

কর্মক্ষেত্রটি হ'ল ম্যানুয়ালি সমপরিমাণে প্রেডিকেট প্রসারিত করা

SELECT *
FROM customer
WHERE last_name LIKE 'A%'
OR last_name LIKE 'E%'

jOOQ বাক্সের বাইরে এমন একটি সিনথেটিক শিকারকে সমর্থন করতে পারে।


পোস্টগ্র্যাস এসকিউএল LIKE/ILIKE ANY (ARRAY[]):

SELECT *
FROM t
WHERE c LIKE ANY (ARRAY['A%', '%B']);

SELECT *
FROM t
WHERE c LIKE ANY ('{"Do%", "%at"}');

ডিবি <> ফিডাল ডেমো


স্নোফ্লেকও কোনও পছন্দ / সমস্ত মিলের মতো পছন্দ করে:

যেকোন / সমস্ত পছন্দ করুন

এক বা একাধিক নিদর্শনগুলির সাথে তুলনার ভিত্তিতে স্ট্রিংগুলির কেস-সংবেদনশীল মিলটিকে মঞ্জুরি দেয়

<subject> LIKE ANY (<pattern1> [, <pattern2> ... ] ) [ ESCAPE <escape_char> ]

উদাহরণ:

SELECT * 
FROM like_example 
WHERE subject LIKE ANY ('%Jo%oe%','T%e')
-- WHERE subject LIKE ALL ('%Jo%oe%','J%e')

4

আপনি এমনকি এটি চেষ্টা করতে পারেন

ক্রিয়া

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+'%';

4

আমার একটি সহজ সমাধান রয়েছে যা রেগেক্সের তালিকা অনুসরণ করে কমপক্ষে পোস্টগ্র্যাস্কল- এ কাজ করে like any। এখানে একটি উদাহরণ, একটি তালিকার কয়েকটি অ্যান্টিবায়োটিক সনাক্তকরণের দিকে তাকানো:

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

3

আমিও এমন কিছু নিয়ে ভাবছিলাম। আমি শুধু একটি সমন্বয় ব্যবহার করে পরীক্ষিত SUBSTRINGএবং INএবং এটি সমস্যা এই ধরনের একটি কার্যকর সমাধান। নীচের কোয়েরি চেষ্টা করুন:

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

1
এই পদ্ধতির সাথে একটি সমস্যা হ'ল আপনি যদি t1- তে কোনও সূচক ব্যবহার করার ক্ষমতাটি looseিলা করেন তবে কিছু উপস্থিত থাকলে ..
ShoeLace

1
এটি 'ব্যাটজ' কখনই খুঁজে পাবে না
মিক

3

ইন ওরাকল আপনি নিম্নলিখিত ভাবে একটি সংগ্রহ ব্যবহার করতে পারেন:

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

2

SQL সার্ভারের জন্য আপনি ডায়নামিক এসকিউএল অবলম্বন করতে পারেন।

এই ধরনের পরিস্থিতিতে বেশিরভাগ সময় আপনার কাছে ডাটাবেস থেকে কিছু ডেটার ভিত্তিতে আইএন ক্লজের প্যারামিটার থাকে।

নীচের উদাহরণটি কিছুটা "বাধ্য", তবে এটি উত্তরাধিকারের ডাটাবেসে পাওয়া বিভিন্ন বাস্তব মামলার সাথে মেলে।

ধরুন আপনার টেবিল ব্যক্তি রয়েছে যেখানে ব্যক্তির নামগুলি একটি একক ক্ষেত্রে পার্সননাম ফার্স্টনাম + '' + লাস্টনাম হিসাবে সংরক্ষণ করা থাকে। আপনার প্রথম নামের একটি তালিকা থেকে সমস্ত ব্যক্তিকে নির্বাচন করতে হবে, ফিল্ড নেমটোসলেক্টে সারণীতে নাম সারণীতে সঞ্চিত , প্লাস কিছু অতিরিক্ত মাপদণ্ড (লিঙ্গ, জন্ম তারিখ, প্রভৃতি ফিল্টার মত)

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন

-- @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

2

আমার এটির জন্য একটি সমাধান থাকতে পারে, যদিও এটি কেবল এসকিউএল সার্ভার ২০০৮ এ কাজ করবে যতদূর আমি জানি। আমি আবিষ্কার করেছি যে আপনি 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+'%' 

এটি ফলাফলের তালিকায় প্রদত্ত পছন্দ মতো ই-মেইল অ্যাড্রেসযুক্ত সমস্ত ব্যবহারকারীকে ফলাফল দেবে। আশা করি এটি কারও কাজে আসবে। সমস্যাটি আমাকে কিছুক্ষণ বিরক্ত করেছিল।


1
এটা আকর্ষণীয়. তবে সচেতন থাকুন যে এটি কেবল একটি ছোট টেবিলে ব্যবহার করা উচিত কারণ লাইক স্টেটমেন্টটি সূচকগুলি ব্যবহার করতে পারে না। এ কারণেই সম্পূর্ণ পাঠ্য অনুসন্ধানটি যখন অভ্যন্তরীণভাবে সেট আপ করা শক্ত, তবে আপনার কাছে প্রচুর ডেটা থাকলে ভাল পছন্দ।
এইচএলজিইএম

2

২০১ with থেকে শুরু করে এসকিউএল সার্ভারে একটি STRING_SPLIT ফাংশন অন্তর্ভুক্ত রয়েছে । আমি এসকিউএল সার্ভার v17.4 ব্যবহার করছি এবং এটি আমার জন্য কাজ করার জন্য পেয়েছি:

DECLARE @dashboard nvarchar(50)
SET @dashboard = 'P1%,P7%'

SELECT * from Project p
JOIN STRING_SPLIT(@dashboard, ',') AS sp ON p.ProjectNumber LIKE sp.value


1

এটি কমা দ্বারা বিযুক্ত মানগুলির জন্য কাজ করে

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

আপনি যদি এটি সূচকগুলি ব্যবহার করতে চান তবে আপনাকে অবশ্যই প্রথম '%'অক্ষরটি বাদ দিতে হবে ।


1

ওরাকল আরবিডিএমএসে আপনি REGEXP_LIKE ফাংশনটি ব্যবহার করে এই আচরণটি অর্জন করতে পারেন ।

নীচের কোডটি পরীক্ষা করবে যদি তিনটি স্ট্রিং তালিকার একটিতে উপস্থিত থাকে তবে | দুই | তিন | চার | পাঁচটি (যার মধ্যে পাইপ " | " প্রতীকটির অর্থ OR লজিক অপারেশন)।

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_ *) সম্পর্কিত কয়েকটি ফাংশন রয়েছে। আপনি যদি একজন ওরাকল বিকাশকারী এবং এই বিষয়টি আগ্রহী হন তবে ওরাকল ডেটাবেস সহ নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করা ভাল হওয়া উচিত ।


1

আপনি কি এই জাতীয় সংমিশ্রণটি ভাবতে পারেন:

SELECT  * 
FROM    table t INNER JOIN
(
  SELECT * FROM (VALUES('bla'),('foo'),('batz')) AS list(col)
) l ON t.column  LIKE '%'+l.Col+'%'

আপনি যদি নিজের টার্গেট সারণীর জন্য পূর্ণ পাঠ সূচকটি সংজ্ঞায়িত করেন তবে আপনি এই বিকল্পটি ব্যবহার করতে পারেন:

SELECT  * 
FROM    table t
WHERE CONTAINS(t.column, '"bla*" OR "foo*" OR "batz*"')

ধন্যবাদ. এটি গ্রহণযোগ্য উত্তর আইএমও হওয়া উচিত। প্রত্যেকেরই একটি সংজ্ঞায়িত পূর্ণ পাঠ্য সূচক থাকে না (যার অর্থ যাই হোক না কেন) আপনার প্রথম পরামর্শগুলি কবজ হিসাবে কাজ করে। এমনকি আপনি ওয়াইল্ডকার্ডগুলিকেও পছন্দ মতো করে মনোযোগ দেওয়ার পরিবর্তে টেম্প টেবিলের মানগুলিতে রাখতে পারেন।
মূর্খ


0

তেরদাটাতে আপনি ব্যবহার করতে পারেন LIKE ANY ('%ABC%','%PQR%','%XYZ%')। নীচে এমন একটি উদাহরণ দেওয়া আছে যা আমার জন্য একই ফলাফল তৈরি করেছে

--===========
--  CHECK ONE
--===========
SELECT *
FROM Random_Table A
WHERE (Lower(A.TRAN_1_DSC) LIKE ('%american%express%centurion%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%bofi%federal%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%american%express%bank%fsb%'))

;
--===========
--  CHECK TWO
--===========
SELECT *
FROM Random_Table  A
WHERE Lower(A.TRAN_1_DSC) LIKE ANY 
('%american%express%centurion%bank%',
'%bofi%federal%bank%',
'%american%express%bank%fsb%')

0

আমি জানি এটি খুব দেরী হয়েছে, তবে আমারও একই অবস্থা ছিল। আমার কাছে সংরক্ষিত পদ্ধতিগুলির সেটগুলির জন্য আমার "লাইক ইন" অপারেটরের দরকার ছিল যা অনেকগুলি পরামিতি গ্রহণ করে এবং তারপরে একাধিক আরডিবিএমএস সিস্টেম থেকে ডেটা সংগ্রহের জন্য সেই পরামিতিগুলি ব্যবহার করে, সুতরাং কোনও আরডিবিএমএস-নির্দিষ্ট কৌশল কাজ করবে না, তবে সঞ্চিত পদ্ধতি এবং কোনও ফাংশন এমএস এসকিউএল সার্ভারে চলবে, তাই আমরা প্রতিটি আরডিবিএমএসের জন্য সম্পূর্ণ এসকিউএল স্টেটমেন্ট জেনারেশনের কার্যকারিতার জন্য টি-এসকিউএল ব্যবহার করতে পারি, তবে আউটপুটটি মোটামুটি আরডিবিএমএস-স্বতন্ত্র হওয়া দরকার।

আমি এই মুহুর্তে একটি সীমানাযুক্ত স্ট্রিং (যেমন কোনও প্যারামিটার একটি সঞ্চিত পদ্ধতিতে আসা) এসকিউএল-এর একটি ব্লকে পরিণত করার জন্য এসেছি। আমি এটি "লাইক ইন" এর জন্য "লাইচেন" বলি। এটা নাও?

Lichen.sql

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =======================================================================
-- Lichen - Scalar Valued Function
-- Returns nvarchar(512) of "LIKE IN" results.  See further documentation.
-- CREATOR: Norman David Cooke
-- CREATED: 2020-02-05
-- UPDATED:
-- =======================================================================
CREATE OR ALTER FUNCTION Lichen 
(
    -- Add the parameters for the function here
    @leadingAnd bit = 1,
    @delimiter nchar(1) = ';',
    @colIdentifier nvarchar(64),
    @argString nvarchar(256)
)
RETURNS nvarchar(512)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result nvarchar(512)

    -- set delimiter to detect (add more here to detect a delimiter if one isn't provided)
    DECLARE @delimit nchar(1) = ';'
    IF NOT @delimiter = @delimit 
        SET @delimit = @delimiter


    -- check to see if we have any delimiters in the input pattern
    IF CHARINDEX(@delimit, @argString) > 1  -- check for the like in delimiter
    BEGIN  -- begin 'like in' branch having found a delimiter
        -- set up a table variable and string_split the provided pattern into it.
        DECLARE @lichenTable TABLE ([id] [int] IDENTITY(1,1) NOT NULL, line NVARCHAR(32))
        INSERT INTO @lichenTable SELECT * FROM STRING_SPLIT(@argString, ';')

        -- setup loop iterators and determine how many rows were inserted into lichen table
        DECLARE @loopCount int = 1
        DECLARE @lineCount int 
        SELECT @lineCount = COUNT(*) from @lichenTable

        -- select the temp table (to see whats inside for debug)
        --select * from @lichenTable

        -- BEGIN AND wrapper block for 'LIKE IN' if bit is set
        IF @leadingAnd = 1
            SET @result = ' AND ('
        ELSE
            SET @result = ' ('

        -- loop through temp table to build multiple "LIKE 'x' OR" blocks inside the outer AND wrapper block
        WHILE ((@loopCount IS NOT NULL) AND (@loopCount <= @lineCount))
        BEGIN -- begin loop through @lichenTable
            IF (@loopcount = 1) -- the first loop does not get the OR in front
                SELECT @result = CONCAT(@result, ' ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
            ELSE  -- but all subsequent loops do
                SELECT @result = CONCAT(@result, ' OR ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
            SET @loopcount = @loopCount + 1     -- increment loop
        END -- end loop through @lichenTable

        -- set final parens after lichenTable loop
        SET @result = CONCAT(@result, ' )')
    END  -- end 'like in' branch having found a delimiter
    ELSE -- no delimiter was provided
    BEGIN   -- begin "no delimiter found" branch
        IF @leadingAnd = 1 
            SET @result = CONCAT(' AND ', @colIdentifier, ' LIKE ''' + @argString + '''')
        ELSE
            SET @result = CONCAT(' ', @colIdentifier, ' LIKE ''' + @argString + '''')
    END     -- end "no delimiter found" branch

    -- Return the result of the function
    RETURN @result
END  -- end lichen function

GO

ডিলিমিটার সনাক্তকরণ সম্ভবত পরিকল্পনা করা হয়েছে, তবে আপাতত এটি সেমিকোলনের ডিফল্ট হয় যাতে আপনি কেবল defaultসেখানে প্রবেশ করতে পারেন । এতে সম্ভবত বাগ রয়েছে। দ্য@leadingAndপরামিতি নির্ধারণ করতে যদি আপনি ব্লক সামনে একটি নেতৃস্থানীয় "এবং" করা চান তাই এটি অন্যান্য WHERE বাক্যাংশ সংযোজন সঙ্গে চমত্কারভাবে মধ্যে ফিট করে শুধুমাত্র একটি বিট মান।

ব্যবহারের উদাহরণ (আর্গস্ট্রিংয়ের ডিলিমিটার সহ)

SELECT [dbo].[Lichen] (
   default        -- @leadingAND, bit, default: 1
  ,default        -- @delimiter, nchar(1), default: ';'
  ,'foo.bar'      -- @colIdentifier, nvarchar(64), this is the column identifier
  ,'01%;02%;%03%' -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO

এমন একটি এনভারচর (512) ফিরিয়ে দেবে:

 AND ( foo.bar LIKE '01%' OR foo.bar LIKE '02%' OR foo.bar LIKE '%03%' ) 

যদি ইনপুটটিতে ডিলিমিটার না থাকে তবে এটি ব্লকটি এড়িয়ে যাবে:

ব্যবহারের উদাহরণ (আর্গস্ট্রিংয়ের সীমানা ছাড়াই)

SELECT [dbo].[Lichen] (
   default        -- @leadingAND, bit, default: 1
  ,default        -- @delimiter, nchar(1), default: ';'
  ,'foo.bar'      -- @colIdentifier, nvarchar(64), this is the column identifier
  ,'01%'          -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO

এমন একটি এনভারচর (512) ফিরিয়ে দেবে:

 AND foo.bar LIKE '01%'

আমি এ নিয়ে কাজ চালিয়ে যাচ্ছি, সুতরাং আমি যদি কিছু উপেক্ষা করেছি (সুস্পষ্টভাবে স্পষ্টভাবে বা অন্যথায়) দয়া করে বিনা দ্বিধায় মন্তব্য করতে বা পৌঁছে যেতে পারেন।


-3

এটা কর

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

অথবা

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

1
কেমন চলছে কাজ? এলএইচএস একটি% এর সাথে একটি স্ট্রিং, এবং এটি% তাই ওয়াইল্ডকার্ড নয়
দারিয়াস এক্স।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.