【问题标题】:SQL CASE LIKE with multiple choicesSQL CASE LIKE 有多种选择
【发布时间】:2015-07-27 05:59:20
【问题描述】:

在我的查询中,我有以下部分代码:

CASE WHEN Field1 LIKE '%choice1%' OR Field1 LIKE '%Choice1%' .... THEN 'category 1'
     WHEN Field1 LIKE '%choicea%' OR Field1 LIKE '%Choiceb%' .... THEN 'category 2'
END AS 'Cats'

我有很多这样的选择(1line 大约 20),(2line 大约 15 和儿子)。

我可以做一些事情来使我的代码更干净,我通常使用IN 来做一些事情吗?

例子:

CASE WHEN Field1 IN LIKE ('%choice1'.'%choice2%',...) THEN 'category 1'
     WHEN Field1 IN LIKE ('%choicea'.'%choiceb%',...) THEN 'category 2'
END AS 'Cats'

附:我听说我可以以某种方式使用那些||,但我在谷歌中找不到如何使用它们。

你怎么看这个问题?

【问题讨论】:

  • 您使用的是什么 RDMS 和版本?
  • 我知道清理它的唯一方法是,如果您可以使用此处显示的通配符找到匹配多个条件的模式:w3schools.com/sql/sql_wildcards.asp。无法在单个 LIKE 条件中指定多个模式。
  • 如果您的 DBMS 支持正则表达式,您可以使用 REGEXP_SIMILAR 表示 WHEN 的所有 Ors。 Field1 多久更新一次?我会添加一个新列,更新到匹配的类别,然后在每次插入/更新期间分配它
  • @Pixalated 我正在使用 Microsoft SQL Server
  • @Chris Flynn 我试过通配符但没有帮助

标签: sql sql-server tsql case sql-like


【解决方案1】:

如果这些选择是已知的,请将它们放在一个表中并使用连接:

SELECT Field1, c.Category
FROM MainTable 
LEFT JOIN Choices c ON Field1 LIKE ('%' + c.Choice + '%')

更新:
如果一个类别中有子字符串,请在此查询中添加DISTINCT

【讨论】:

  • 如果Field1 匹配多个LIKE,这将多次返回同一行。
  • @dnoeth 我也想到了。如果选择是唯一的,而不是彼此的子字符串,那将不会发生。否则,它必须像CASE 一样只选择第一个匹配项,但听起来并非如此。
  • 好的,这改变了很多。实际上其中一些是其他的子字符串。
  • 在这些情况下,您希望选择哪个类别?
  • 然后你可以只保留最短的,因为它们更通用,并删除其他的,就好像一个字符串匹配较长的字符串,它也会匹配最短的字符串。在您的示例中,任何匹配 LIKE '%wifi%'LIKE '%wifo%' 的内容也将匹配 LIKE '%wif%',所以只需保留 LIKE '%wif%'
【解决方案2】:

我认为您将 SQL 用于它不是为它设计的东西。拥有这么多类似的语句将导致您的查询绝对破坏 SQL 服务器上的资源,并且当您获得比演示数据库更多的行时,您将拥有一个让您的用户哭泣的运行时。

如果您需要此类信息,您需要尝试以下方法之一:

1.创建新列来存储您尝试提取的数据,并编写更新语句以解析出该内容。例如,如果您有像 'warning%' 这样的案例文本,请创建一个 isWarning 位列,或者一个类型 varchar 并在其中存储 'Warning'

  1. 从数据库中选择不带大小写/类似的数据,然后在您的业务代码中执行该查找

【讨论】:

  • 感谢您的评论。我知道这将如何减慢我的查询速度,但我只有大约 20k 行,因此我没有将其视为真正的危险。
【解决方案3】:

如果您的逻辑仍然适用于完全匹配,您可以尝试 decode() 函数,我知道 Oracle DB 支持它:http://psoug.org/reference/decode_case.html

【讨论】:

  • 我对解码不熟悉,谢谢提供。我会阅读更多。
  • DECODE 是不推荐使用的 Oracle 语法,类似于简单的 CASE x WHEN,无法将其用于此目的。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2020-05-04
  • 1970-01-01
  • 2016-01-11
  • 2019-07-04
相关资源
最近更新 更多