首页 > 解决方案 > 创建显示查询匹配的列

问题描述

我想问是否有人可以提供有关 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
          )

提前感谢您的任何建议!

标签: sqlteradatateradata-sql-assistant

解决方案


如果一列只包含一个匹配项,您可以简单地切换到 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

推荐阅读