sql - 创建显示查询匹配的列
问题描述
我想问是否有人可以提供有关 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
)
提前感谢您的任何建议!
解决方案
如果一列只包含一个匹配项,您可以简单地切换到 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
推荐阅读
- objective-c - 优化在 Obj C 中调用自身的函数
- asp.net - 如何将 EF CLass 库添加到适用于 .net 4.5 和 dotnet core 的解决方案中
- spring-boot - Spring Boot - 如何在登录前显示静态资源?
- java - 轮询 Pod 的就绪状态
- angular - NgFor 重复一个 div 表单并将输入分配给 NgModel
- android - 如何在 Gradle 3+ 上进行 ABI 拆分以更改版本代码?
- python - 如何获取 tensorflow 的预制估计器的图形定义
- file - 从预先格式化的 Golang 文件中读取
- java - spring-data-solr:单个集合中的多个存储库?
- javascript - 从页面上的元素中获取 URL 以缩短 Bitly URL