【问题标题】:Creating a column displaying query match创建显示查询匹配的列
【发布时间】:2020-11-21 03:40:57
【问题描述】:

我想问是否有人可以就 Teradata/SQL 查询提供任何建议。作为我日常职责的一部分,我经常在数据库中运行字符串/文本/批量搜索,以查找大量字符串/名称列表(例如,动物物种 A、B、C、D,这些列表可能会达到 700 甚至 1,100一次命名)。通过“LIKE ANY”语句和每个字符串前后的一些“%”字符提取和导出数据我没有问题。

我遇到的问题是 SQL/Teradata 会给我我需要的东西,但是我的语句没有突出显示每个从我使用的列表返回的特定数据行中找到的实体。另外,有些字符串可以在 2-3 个不同的列中找到,而不仅仅是 1 列)例如,如果我有 700 种动物并且我的语句返回 25,000 个数据点,那么匹配哪个字符串会非常有益在给定列中找到并避免手动创建其他列并在例如 excel 中查看数据。

例如,将显示的附加列“为第 1 列找到的名称/实体”(例如,第 2 行的匹配项是“狗种类 124”,第 1,023 行是“猫种类 456”)将证明非常有用。

下面我附上一个示例语句:

      SELECT *
        FROM Table_Animal_Species
        WHERE Date BETWEEN '2005' AND '2010'
        AND
        (
    SpeciesColumn1 LIKE ANY ('%cat 123%', '%dog 456%') Or
    SpeciesColumn2 LIKE ANY ('%cat 123%', '%dog 456%') Or
    SpeciesColumn3 LIKE ANY ('%cat 123%', '%dog 456%') Or
          )

提前感谢您的任何建议!

【问题讨论】:

  • 一列能否匹配多个名称,即'%cat 123%', '%dog 456%'SpeciesColumn1

标签: sql teradata teradata-sql-assistant


【解决方案1】:

如果一列只包含一个匹配项,您可以简单地切换到 RegEx 而不是 LIKE。它也更容易编写,名称由| 分隔,但您可能创建该列表而不是键入它:-)

SELECT 
   regexp_substr(SpeciesColumn1, 'cat 123|dog 456', 1, 1, 'i') AS found_in_column_1
  ,regexp_substr(SpeciesColumn2, 'cat 123|dog 456', 1, 1, 'i') AS found_in_column_2
  ,regexp_substr(SpeciesColumn3, 'cat 123|dog 456', 1, 1, 'i') AS found_in_column_2
  ,t.*
FROM Table_Animal_Species AS t
WHERE found_in_column_1 IS NOT NULL
   OR found_in_column_2 IS NOT NULL
   OR found_in_column_3 IS NOT NULL

【讨论】:

  • Teradata 是否允许在 where 子句中重新使用列别名?
  • @GordonLinoff:是的,完全错误,没有标准 SQL,但真的很好。在许多情况下,它类似于 OUTER APPLY :-)
  • @dnoeth 非常感谢您的意见。它就像一个魅力(真的很有帮助)!我会有一个后续问题。 SQL/Teradata 是否允许单独创建一个列表,然后以更简单的方式在 regexp_substr 函数中引用它?例如定义/创建 Animal list = ["dog123", "cat123", "moose123"] 然后引用 Animal 列表而不是 regexp_substr 中的一长串名称?再次感谢您非常周到的回复!
  • SELECT 'cat 123|dog 456' AS animal_list ,regexp_substr(SpeciesColumn1, animal_list, 1, 1, 'i')...with cte as (SELECT 'cat 123|dog 456' AS animal_list) select regexp_substr(SpeciesColumn1, animal_list, 1, 1, 'i')... from cte
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 2020-02-22
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多