Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL检查列中是否存在任何模式的最快方法_Sql_Performance_Count_Teradata - Fatal编程技术网

使用SQL检查列中是否存在任何模式的最快方法

使用SQL检查列中是否存在任何模式的最快方法,sql,performance,count,teradata,Sql,Performance,Count,Teradata,我正在尝试编写代码,允许我检查表中是否存在任何特定模式的情况 我目前的做法是 select count(*) from database.table where column like (some pattern) 并查看计数是否大于0 我很想知道是否有任何方法可以加快这个过程,因为这种类型的模式查找在我的查询中是在循环中发生的,我需要知道的是,是否有一个这样的案例,而不是案例总数 如有任何建议,将不胜感激 编辑:为了验证数据质量,我在Teradata存储过程中运行此操作。就性能而言,更好

我正在尝试编写代码,允许我检查表中是否存在任何特定模式的情况

我目前的做法是

select count(*) 
from database.table 
where column like (some pattern)
并查看计数是否大于0

我很想知道是否有任何方法可以加快这个过程,因为这种类型的模式查找在我的查询中是在循环中发生的,我需要知道的是,是否有一个这样的案例,而不是案例总数

如有任何建议,将不胜感激


编辑:为了验证数据质量,我在Teradata存储过程中运行此操作。

就性能而言,更好的方法是:

  • 根据您的模式选择结果集
  • 将结果集的大小限制为1
  • 检查是否返回了结果
  • 这样做可以防止数据库引擎必须执行完整的表扫描,并且查询将在遇到第一条匹配记录时立即返回

    实际查询取决于您使用的数据库。在MySQL中,它看起来像:

    SELECT id FROM database.table WHERE column LIKE '%some pattern%' LIMIT 1;
    
    在Oracle中,它将如下所示:

    SELECT id FROM database.table WHERE column LIKE '%some pattern%' AND ROWNUM = 1;
    

    如果您实际上不需要知道有多少匹配项,那么使用
    EXISTS
    会更快。类似这样的方法会奏效:

    IF EXISTS (
        SELECT *
        FROM bigTbl
        WHERE label LIKE '%test%'
    )
        SELECT 'match'
    ELSE
        SELECT 'no match'
    

    这会更快,因为一旦找到一个匹配项,它就可以返回一个结果。

    如果不需要实际计数,Teradata中最有效的方法将使用
    EXISTS

    select 1
    where exists 
     ( select *
       from database.table 
       where column like (some pattern)
     )
    

    如果模式不存在,这将返回一个空结果集。

    您如何使用它?查询中的循环通常是一个坏符号。。。使用基于集合的方法而不是循环时,SQL工作得更好。更多的上下文将有助于给你一个好的答案。在发布你的问题时也指定你的RDBMS,因为不同的数据库有不同的功能。谢谢大家的评论。我应该解释得更清楚些。我在Teradata存储过程中使用这些查询,并尝试使用它对表进行数据质量检查。基本概念是使用循环遍历表中的各个列,并使用select count语句执行检查,以查看是否存在超出我们预期范围的情况。我认为使用IF-Exist可能会更好,如下所示,但我认为正常情况下是没有匹配项的情况。谢谢。实际上我的选择失败了。3706:语法错误:应在“')和“*”之间。运行此查询时。@HangilJang:当然失败了,应该没有
    *
    ,我会修正我的答案