【问题标题】:How to SELECT using both wildcards (LIKE) and array (IN)?如何同时使用通配符(LIKE)和数组(IN)进行选择?
【发布时间】:2011-12-15 12:57:25
【问题描述】:

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

【问题讨论】:

标签: sql sql-like


【解决方案1】:
SELECT *
FROM table_name
WHERE field_name LIKE '%one'
   OR field_name LIKE '_two'
   OR field_name LIKE 'three[abv]'

【讨论】:

  • 我希望避免这种开销,但这似乎是唯一的方法。碰巧的是,即使这样做也会导致巨大的开销,因为我有一个包含数百个条目的数组。只使用 IN 很快。 LIKE 需要永远:/
【解决方案2】:

您可以将 join 与 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多