【问题标题】:Remove code-duplication in SQL query删除 SQL 查询中的代码重复
【发布时间】:2018-05-16 12:01:05
【问题描述】:

有没有办法删除多次重复: LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1) 在以下查询中?

SELECT 
    ISNULL(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1), 'Total'), 
    Count([Id]) 
FROM [dbo].[Ids]
GROUP BY ROLLUP(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1))
ORDER BY 
    GROUPING(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1)), 
    COUNT([Id]) DESC,
    LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1)

尽管我有一个具体的例子,但我希望找到一个通用的解决方案来解决这个问题。

【问题讨论】:

    标签: sql sql-server syntax code-duplication


    【解决方案1】:

    一种方法使用子查询。另一个 CTE。我喜欢第三种方式,横向连接使用apply

    SELECT COALESCE(v.x, 'Total'), 
           Count(*) 
    FROM [dbo].[Ids] i OUTER APPLY
         (VALUES (LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1) )
         ) v(x)
    GROUP BY ROLLUP(v.x)
    ORDER BY GROUPING(v.x), 2 DESC
    

    【讨论】:

    • @Halex 。 . .缺少括号。
    【解决方案2】:

    如果您在多个查询中执行此操作,您可以创建一个 user defined scalar function

    CREATE FUNCTION Patterniser(@ID varchar(100))  
    RETURNS varchar(100)  
    AS  
    BEGIN  
       DECLARE @Patterned varchar(100)  
            @Patterned= LEFT(@ID, PATINDEX('%[0-9]%', @ID) - 1)
        RETURN @Patterned
    END 
    

    然后在任何你想使用它的地方拨打dbo.Patterniser([Id])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 2021-11-07
      • 2019-12-11
      • 1970-01-01
      • 2020-02-17
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多