Чи є комбінація “LIKE” та “IN” у SQL?


341

У SQL I (на жаль) часто доводиться використовувати " LIKE" умови через бази даних, які порушують майже кожне правило нормалізації. Я не можу це змінити зараз. Але це питання не має значення.

Крім того, я часто використовую такі умови, як WHERE something in (1,1,2,3,5,8,13,21)поліпшення читабельності та гнучкості моїх операторів SQL.

Чи можливий спосіб поєднання цих двох речей без написання складних підборів?

Я хочу чогось такого простого, як WHERE something LIKE ('bla%', '%foo%', 'batz%')замість цього:

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

Я працюю з сервером SQl і Oracle тут, але мені цікаво, чи взагалі це можливо в будь-якій RDBMS.


1
Ви маєте робити або подобатися або: І (щось НАДУЄТЬСЯ '% річ%' або щось НАДЕЖДА '% річ%' або щось подібне як '% річ%')
Cosmic Hawk

Я б хотів, щоб у нас були Teradata like any/ like all: stackoverflow.com/questions/40475982/sql-like-any-vs-like-all . (Для запиту це запитували на форумі спільноти Oracle Community Ideo.oracle.com/ideas/11592 )
Вільям Робертсон

Відповіді:


196

Немає комбінації LIKE & IN в SQL, тим більше в TSQL (SQL Server) або PLSQL (Oracle). Частина причини цього полягає в тому, що повний пошук тексту (FTS) є рекомендованою альтернативою.

І Oracle, і SQL Server FTS реалізація підтримують ключове слово CONTAINS, але синтаксис все ще трохи відрізняється:

Oracle:

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

SQL Server:

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

Стовпець, який ви запитуєте, повинен бути повнотекстовим.

Довідка:


11
Привіт, з Oracle, вам потрібно побудувати індекси простого тексту на стовпцях, до яких потрібно застосувати оператор "CONTAINS". Залежно від обсягу ваших даних це може бути досить довгим.
П'єр-Жиль Леваллуа

18
Що стосується SQL Server (принаймні версії 2008 року), коментар @Pilooz також застосовується, вам потрібно створити повнотекстові індекси.
Марсель

Максимальна довжина - 4000.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

59

Якщо ви хочете зробити свою заяву легко читабельною, тоді ви можете використовувати REGEXP_LIKE (доступний з версії 10 Oracle далі).

Приклад таблиці:

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.

АЛЕ ...

Я б не рекомендував це сам через не дуже хорошу роботу. Я б дотримувався кількох предикатів LIKE. Тож приклади були просто для розваги.


4
+1 приємна ілюстрація використання REGEXP в 10г. Мені цікаво, хоч якби продуктивність справді була б набагато гіршою. Для обох знадобиться сканування повної таблиці та / або індексу, ні?
DCookie

12
Правда. Але регулярні вирази спалюють процесор як божевільний, а не I / O. Якщо воно гірше і наскільки воно гірше, залежить від того, наскільки великий ваш список виразів і чи індексується стовпець чи ні, серед інших. Це просто попередження, щоб оригінальний плакат не здивувався, коли він почне його реалізовувати.
Роб ван Війк

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

спробуйте (використовуючи синтаксис SQL Server):

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)

Гаразд, це спрацювало б, але це не йде в моєму напрямку, щоб зробити оператор SQL легше читабельним :)
selfawaresoup

10
у SQL ви використовуєте індекс та використання. Використовуйте відступи та імена для читабельності SQL, коли ви вносите інші зміни для читабельності, ви лише ризикуєте змінити план виконання (що впливає на використання індексу та продуктивність). Якщо ви не будете обережні, ви можете легко змінити миттєво запущений запит на дуже повільний, внісши дрібниці.
КМ.

Перше твердження цієї відповіді є ключовим - системи та мови, що базуються на SQL, не підтримують те, що ви хочете, не застосовуючи робочих обставин. (Чи допоможе на сервер SQL повне індексування тексту?)
Філіп Келлі

@Philip Kelley, чи може це зробити індексація повного тексту SQL Server LIKE 'bla%' , що в прикладі коду ОП? чи можна робити лише LIKE '%bla%'пошуки?
КМ.

Я, чесно кажучи, не знаю, я ніколи не використовував FT індексацію. Я підкинув це як зразок можливого обходу, який вже входить у продукт. Для того, що він робить (A або B або C), я підозрюю, що це не робить, я досить впевнений, що для того, щоб визначити це, знадобиться багато зусиль, і знаю, що це виходить за рамки його початкового запитання (чи SQL роблять це вдома).
Філіп Келлі

20

Для PostgreSQL є ANYабо ALLформа:

WHERE col LIKE ANY( subselect )

або

WHERE col LIKE ALL( subselect )

де підселекція повертає рівно один стовпець даних.


1
Існують LIKE ANYі LIKE ALLзагальні для всіх діалектів SQL, тобто частина основного мови, або специфічною для діалекті?
Асад Ебрагім

1
@AssadEbrahim, ні вони конкретні. Oracle має = ANYабо <> ALLпрацює, але працює лише в SQL, а не в PLSQL.
Бенуа

Я думаю, що це стандартний синтаксис (але не багато СУБД його реалізували)
ypercubeᵀᴹ


13

Ще одне рішення, яке має працювати на будь-якій 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)

1
Але це гірше, ніж набір тверджень про АБО
Fandango68

1
@ Fandango68, але об'єднання вибраних може бути замінено іншим джерелом шаблонів, як таблиця, вид тощо.
mik

10

Я б запропонував використовувати користувальницьку функцію TableValue, якщо ви хочете інкапсулювати методи внутрішнього приєднання або темп таблиці, показані вище. Це дозволило б їй читати трохи чіткіше.

Після використання функції розділення, визначеної за адресою: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

ми можемо написати наступне на основі таблиці, яку я створив під назвою "Fish" (int id, varchar (50) Name)

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 Walleye

1
Рядок буде дублюватись, якщо відповідати одразу багатьом умовам.
мік

7

Одним із підходів було б зберігання умов у темп-таблиці (або змінної таблиці на SQL Server) та приєднанні до такої, як це:

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

Рядок буде дублюватись, якщо відповідати одразу багатьом умовам.
мік

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
Ну, саме цього я хотів би уникнути. Хоча це працює.
selfawaresoup

Чому уникати цього рішення? Він працює так само швидко, як прийняте рішення, і настільки ж універсальний.
Філ Фактор

3
@PhilFactor Це рішення може створювати повторювані рядки.
Якуб Канія

5

Я працюю з сервером SQl і Oracle тут, але мені цікаво, чи взагалі це можливо в будь-якій RDBMS.

Teradata підтримує синтаксис LIKE ALL / ANY :

ВСІ кожний рядок у списку.
БУДЬ будь-який рядок у списку.

┌──────────────────────────────┬────────────────────────────────────┐
      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 підтримує цей синтаксис:

Додайте синтетичні оператори [NOT] LIKE ANY і [NOT] LIKE ALL

Багато разів користувачі SQL хотіли б мати можливість комбінувати предикати LIKE та IN, як у:

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 може підтримувати такий синтетичний предикат поза коробкою.


PostgreSQL LIKE/ILIKE ANY (ARRAY[]):

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

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

db <> скриптова демонстрація


Сніжинка також підтримує відповідність LIKE ANY / LIKE ALL :

ПОДОБАЙТЕ ЯКЩО / ВСІ

Дозволяє відповідність рядків рядків на основі порівняння з одним або кількома шаблонами.

<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

У мене є просте рішення, яке працює принаймні в postgresql , використовуючи 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.що, якщо він існує ..
ShoeLace

1
це ніколи не знайде 'batz'
mik

3

В Oracle ви можете використовувати колекцію наступним чином:

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 можна вдатися до Dynamic SQL.

Більшу частину часу у таких ситуаціях ви маєте параметр IN на основі деяких даних із бази даних.

Приклад нижче трохи "вимушений", але це може відповідати різним реальним випадкам, знайденим у застарілих базах даних.

Припустимо, у вас є таблиця Особи, де імена осіб зберігаються в одному полі PersonName як FirstName + '' + LastName. Вам потрібно вибрати всіх осіб зі списку імен, що зберігаються у полі NameToSelect у таблиці NamesToSelect , а також деякі додаткові критерії (наприклад, відфільтровано за статтю, датою народження тощо)

Зробити це можна наступним чином

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

У мене може бути рішення для цього, хоча воно буде працювати лише в 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+'%' 

Це призведе до всіх користувачів із адресою електронної пошти, подібною до вказаних у списку. Сподіваюсь, це комусь корисне. Проблема мене хвилювала деякий час.


1
Це цікаво. Однак майте на увазі, що це слід використовувати лише у таблиці невеликих розмірів, оскільки подібний оператор не може використовувати індекси. Ось чому повний пошук тексту, хоч і важче налаштовувати, це кращий вибір, якщо у вас є багато даних.
HLGEM

2

Починаючи з 2016 року, SQL Server включає STRING_SPLIT функцію . Я використовую SQL Server 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

У Oracle RBDMS ви можете досягти такої поведінки за допомогою функції 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

Існує кілька функцій, пов'язаних з регулярними виразами (REGEXP_ *), доступними в Oracle з 10 г версії. Якщо ви розробник Oracle і зацікавлений у цій темі, це має стати гарним початком із використання регулярних виразів із Oracle Database .


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

Дякую. Це має бути прийнятою відповіддю ІМО. Не всі мають визначений повнотекстовий індекс (що б це не означало) Ваші перші пропозиції працюють як принадність. Ви можете навіть помістити символи підстановки в самі значення значень таблиці темп, а не об'єднуватися в LIKE.
Дурень


0

У Teradata ви можете використовувати 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

Я знаю, що це дуже пізно, але у мене була схожа ситуація. Мені потрібен був оператор "Like In" для набору збережених у мене процедур, які приймають багато параметрів, а потім використовують ці параметри для агрегації даних з декількох систем RDBMS, тому жодні хитрощі, характерні для RDBMS, не спрацюють, однак збережена процедура та будь-які функції буде працювати на MS SQL Server, тому ми можемо використовувати T-SQL для функціональності генерування повних операторів SQL для кожної RDBMS, але вихід повинен бути досить незалежним від RDBMS.

Це те, що я придумав на даний момент, щоб перетворити розділений рядок (наприклад, параметр, що надходить у збережену процедуру) в блок SQL. Я називаю це "Лишайник" для "LIKE IN". Отримаєте?

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 додавань.

Приклад використання (з роздільником у argString)

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

Повернеться nvarchar (512), що містить:

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

Він також буде пропускати блок, якщо вхід не містить роздільника:

Приклад використання (без роздільника в argString)

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

Повернеться nvarchar (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
Як це буде працювати? LHS - це рядок з%, і тому% не є символом
Дарія X.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.