【问题标题】:Conditional Common Table Expression (CTE) in SQLSQL 中的条件公用表表达式 (CTE)
【发布时间】:2010-06-14 16:31:04
【问题描述】:

我正在尝试在 SQL 中选择产品类别树的层次结构。

我的代码如下所示。我正在尝试在 SortOrder 参数上使用 IF 或 Case When 来实现动态排序顺序。

如果@SortOrder 等于'sortorder',注释行应该是活动的。我试图在它周围添加 If Else 语句,但我失败了......

你能帮忙吗?

CREATE PROCEDURE [dbo].[ProductCategory_SelectHierarchy]
    @SortOrder varchar(30)
AS
    SET NOCOUNT ON;

WITH Categories (Id,ParentId,SortOrder,RowOrder) as
(
        SELECT  parentCategory.Id,
                        parentCategory.ParentId,
                        parentCategory.SortOrder,
                        --cast(REPLACE(STR(parentCategory.SortOrder, 8), ' ', '0') as varchar(30)) 'RowOrder'
                        cast(CAST(DATEPART(YEAR, parentCategory.DateCreated) as varchar(4)) + 
                        CAST(DATEPART(MONTH, parentCategory.DateCreated) as varchar(2)) + 
                        CAST(DATEPART(DD, parentCategory.DateCreated) as varchar(2)) + 
                        CAST(DATEPART(HOUR, parentCategory.DateCreated) as varchar(2)) as varchar(50)) 'RowOrder'
        FROM        ProductCategories parentCategory
        WHERE       ParentId = 0

        UNION ALL

        SELECT  childCategories.Id,
                        childCategories.ParentId,
                        childCategories.SortOrder,
                        --cast(Categories.RowOrder + REPLACE(STR(childCategories.SortOrder, 8), ' ', '0') as varchar(30)) 'RowOrder'
                        cast(Categories.RowOrder + '/' + CAST(DATEPART(YEAR, childCategories.DateCreated) as varchar(4)) + 
                        CAST(DATEPART(MONTH, childCategories.DateCreated) as varchar(2)) + 
                        CAST(DATEPART(DD, childCategories.DateCreated) as varchar(2)) + 
                        CAST(DATEPART(HOUR, childCategories.DateCreated) as varchar(2)) as varchar(50)) 'RowOrder'
        FROM        ProductCategories childCategories
        JOIN        Categories
        ON          childCategories.ParentId = Categories.Id
)

SELECT pc.*, Categories.RowOrder 
FROM Categories 
INNER JOIN ProductCategories pc ON pc.Id = Categories.Id
ORDER BY RowOrder

【问题讨论】:

    标签: sql-server common-table-expression


    【解决方案1】:

    你应该可以这样排序:

    ORDER BY
        CASE
            WHEN @SortOrder = 'date_column' THEN CONVERT(VARCHAR(20), date_column, 120)
            WHEN @SortOrder = 'customer_id' THEN RIGHT(REPLICATE('0', 20) + CAST(customer_id AS VARCHAR(20)), 20)
            WHEN @SortOrder = 'name' THEN name
            ELSE sort_order
        END
    

    关键是让所有可排序的列(或表达式)最终成为相同的数据类型。

    【讨论】:

    • 无法正常工作。不过,您的伪代码并没有达到我想要达到的效果。我希望@SortOrder 更静态,例如“createdate”、“salescount”、“name”或“custom”。每种情况都应该产生不同的 SQL 语句。
    • 我刚刚编辑了答案,因为我对您要查找的内容有了更清晰的了解。
    • 哦,我应该按照 order by 子句做。我更改了代码,将所有 4 列添加到数据集中,并按以下顺序执行此操作: ORDER BY CASE WHEN @SortOrder = 'NameSortedOrder' THEN Categories.NameSortedOrder WHEN @SortOrder = 'SalesCountOrder' THEN Categories.SalesCountOrder WHEN @SortOrder = 'DateCreatedOrder' THEN Categories.DateCreatedOrder ELSE Categories.SortOrder END
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多