【问题标题】:how to use many LIKE conditions in SQL easily? [duplicate]如何在 SQL 中轻松使用多个 LIKE 条件? [复制]
【发布时间】:2013-04-12 19:16:46
【问题描述】:

我想在查询中使用许多 LIKE 条件。我找不到实用的解决方案。我试过 CONTAINS 但它不起作用。

而不是使用这个

where EIO.DigiAddress like '%abc@abc.com%'
or EIO.DigiAddress like '%def@def.com%'
or EIO.DigiAddress like '%ghi@ghi.com%'

我想用这样的东西:

CONTAINS(EIO.DigiAddress,'%abc@abc.com%', '%def@def.com%', '%ghi@ghi.com%')

EIO.DigiAddress IN ('%abc@abc.com%', '%def@def.com%', '%ghi@ghi.com%')

【问题讨论】:

  • 是像这样的特定字符串集,还是像电子邮件地址这样的通用格式?
  • 你为什么使用 LIKE '%abc@abc.com%' 来定义你应该使用 ='abc@abc.com' 的电子邮件地址
  • 如果您打算检查有效的电子邮件地址。那么最后一个 % 就不需要了!
  • 这看起来像XY problem。为什么需要很多 LIKE 条件?通常最好避免使用它们,因为它们非常昂贵。那么——您要解决的实际问题是什么?
  • 当我查看下面的所有答案时,我认为多个 LIKE 仍然是最好和最干净的解决方案。抱歉,您在 SQL 中就是这样做的。

标签: sql sql-like


【解决方案1】:

试试这个:

创建临时表:

CREATE TEMPORARY TABLE temp (
    alternate VARCHAR(20)
);

然后:

INSERT INTO temp
VALUES ('%abc@abc.com%'), ('%def@def.com%'), ('%ghi@ghi.com%');

选择:

SELECT t.*
FROM tbl t JOIN temp p ON (t.col LIKE p.alternate);

【讨论】:

  • 创建临时表会减慢查询速度吗?
  • @cihata87 我猜没有.....
【解决方案2】:

我认为使用 LIKE 没有任何问题。但是如果你不喜欢 LIKE 那就用这个(对于 MS SQLSERVER)

where PATINDEX('%abc@abc.com%', EIO.DigiAddress) >0 OR
      PATINDEX('%def@def.com%', EIO.DigiAddress) >0 OR
      PATINDEX('%ghi@ghi.com%', EIO.DigiAddress) >0

注意:您必须根据您使用的数据库,为 PATINDEX 使用相关的字符串函数。

【讨论】:

  • 更好的是 CHARINDEX,因为它在他的情况下更快。
  • PATINDEX 可以使用通配符,但 CHARINDEX 不能。请参考msdn.microsoft.com/en-us/library/ms190184(v=sql.90).aspx
  • 他只在末尾使用通配符。看起来他的意图是“包含”样式搜索。
  • @Indoknight 我会试试这个。谢谢
【解决方案3】:

你可以用正则表达式做到这一点:

where EIO.DigiAddress regexp '[a-c|e-g|g-i]{3}@{1}[a-c|e-g|g-i]{3}.com'

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多