【问题标题】:SQL Specific LIKE ANY String SearchSQL 特定的 LIKE ANY 字符串搜索
【发布时间】:2017-11-02 04:48:32
【问题描述】:

所以我在 Teradata 中试图提取任何具有超过 1 个颜色相关名称的产品,如这里的代码 sn-p 所示:

SELECT
pt.product_number,
COUNT (CASE WHEN ot.option_name like any ('%green%', '%red%', '%blue%') THEN 1 ELSE NULL END) as differentColorCount
FROM product_table pt
JOIN option_table ot on ot.product_num = pt.product_num
HAVING differentColorCount > 1
GROUP BY 1

这运行良好,但我意识到的问题是,一个产品可能有一百个不同的“红色”选项,例如。 (红 1、红 2、红 3 等)。但我只想计算单个产品何时出现两个不同的颜色字符串。

所以我真正需要的是 LIKE ANY,而不是 LIKE ANY。如果 both Red AND Green 都存在,则计 1。如果 both Blue AND Purple 都存在,则计 1。

我意识到我可以做一个很长的列表,我可以在每个可能的组合中做几十个 LIKE ALL,但如果我需要检查它似乎不能很好地扩展,说 100 种不同的颜色而不是 6 种?

如果有人对此有任何见解,我将不胜感激。提前感谢您提供的任何帮助! :)

【问题讨论】:

  • 你不应该在一个字符串中存储多个选项。
  • 您的数据库是什么样的?在 Gordon 看来,您是否将所有值都存储在一个字段中?
  • 如果 gordon 建议您在 option_name 中存储多个值,则需要将该字符串转换为多行 stackoverflow.com/questions/29105836/…
  • 不,选项在另一个表中进行了细分,我只是删除了一些 JOIN 混乱以尝试使问题更清晰一些。基本上,我会在拆分表中检查每种产品的多种颜色的选项名称。
  • 我在问题末尾粘贴了一个更完整的版本,其中包含 JOIN 表。谢谢!

标签: sql teradata sql-like


【解决方案1】:

您可以使用正则表达式来提取颜色,然后应用不同的计数:

Count (DISTINCT RegExp_Substr(option_name, '(green|red|blue)')) AS differentColorCount

这类似于您的like any ('%green%', '%red%', '%blue%'),但返回实际匹配的颜色而不是 TRUE/FALSE。

'(green|red|blue)' 搜索模式分隔定义了三个替代搜索字符串并返回第一个匹配项。

【讨论】:

  • 我对 RegExp_Substr 不是很熟悉,它是不是创建了一个数组,然后在它们之间循环寻找数组中给定数量的匹配项?
  • @ender777:这会在找到时提取列出的子字符串之一,只需运行它而不进行计数即可检查结果。
  • 有道理,再次感谢!前往谷歌一到两个(或五个)小时学习正则表达式。 :)
  • @ender777:小心,这可能会在 100++ 小时后结束,正则表达式是一种编程语言 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2021-12-02
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多