创建显示查询匹配的列

Creating a column displaying query match

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

我遇到的问题是 SQL/Teradata 会给我我需要的东西,但我的陈述没有突出显示根据我使用的列表返回的特定数据行找到了哪个实体。另外,有些字符串可以跨2-3个不同的列找到,而不仅仅是1列)比如我有700种动物,我的语句returns 25000个数据点,对在给定列中找到匹配的字符串,并避免手动创建附加列并查看 excel.

中的数据

例如,将在其中显示的附加列“Name/entity found for Column 1”将证明,例如,第 2 行的匹配项是“dog species 124”,第 1,023 行是“cat species 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
          )

提前感谢您的任何建议!

如果一列仅包含一个匹配项,您只需切换到 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