Как выбрать, используя как подстановочные знаки (LIKE), так и массив (IN)? - PullRequest
14 голосов
/ 15 декабря 2011

В SQL, если вы хотите выполнить SELECT с подстановочным знаком, вы должны использовать:

SELECT * FROM table_name WHERE field_name LIKE '%value%'

Если вы хотите использовать массив возможных значений, вы должны использовать:

SELECT * FROM table_name WHERE field_name IN ('one', 'two', 'three')

Но что бы вы сделали, если бы вы хотели использовать оба подстановочных знака и массив?

Вроде как:

SELECT * FROM table_name WHERE field_name LIKE IN ('%one', '_two', 'three[abv]')

Ответы [ 2 ]

11 голосов
/ 15 декабря 2011
SELECT *
FROM table_name
WHERE field_name LIKE '%one'
   OR field_name LIKE '_two'
   OR field_name LIKE 'three[abv]'
3 голосов
/ 09 декабря 2015

Вы можете использовать соединение с оператором like, как показано ниже:

SELECT * FROM table_name t 
JOIN dbo.Split('one,two,three',',') s ON t.field_name LIKE N'%'+s.item+'%'

Я создаю эту функцию для разделения строки:

CREATE FUNCTION [dbo].[Split] (@StringToSplit NVARCHAR(MAX), @SpliterChar CHAR(1))
RETURNS
    @returnList TABLE ([item] [NVARCHAR] (500))
AS
BEGIN
 DECLARE @nItem NVARCHAR(500);
 DECLARE @pos INT; 
 WHILE CHARINDEX(@SpliterChar, @StringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(@SpliterChar, @StringToSplit); 
  SELECT @nItem = SUBSTRING(@StringToSplit, 1, @pos-1);
  if (@nItem <> '') INSERT INTO @returnList SELECT @nItem;
  SELECT @StringToSplit = SUBSTRING(@StringToSplit, @pos+1, LEN(@StringToSplit)-@pos);
 END
 if (@StringToSplit<>'') INSERT INTO @returnList SELECT @StringToSplit;
 RETURN
END
...