基于栏目的排序

问题描述 投票:0回答:2

我有两个表,PRODUCTS AND LOOKUP TABLES。现在我想根据LOOKUP TABLE中的KEY列值在products表中订购KEY Column。

CREATE TABLE PRODUCTS
(
    ID INT,
    KEY VARCHAR(50)
)

INSERT INTO PRODUCTS 
VALUES (1, 'EGHS'), (2, 'PFE'), (3, 'EGHS'),
       (4, 'PFE'), (5, 'ABC')

CREATE TABLE LOOKUP (F_KEY VARCHAR(50))

INSERT INTO LOOKUP VALUES('PFE,EGHS,ABC')

现在我想根据LOOKUP表中的KEY(PFE,EGHS,ABC)值在PRODUCTS表中订购记录。

示例输出:

产品

ID   F_KEY
-----------    
2    PFE
4    PFE
1    EGHS
3    EGHS
5    ABC

我使用此查询,但它无法正常工作

SELECT * 
FROM PRODUCTS 
ORDER BY (SELECT F_KEY FROM LOOKUP)
sorting sql-server-2008 sql-order-by columnsorting
2个回答
1
投票

您可以使用XML拆分字符串。首先需要将字符串转换为XML并将逗号替换为start和end XML标记。

完成后,您可以使用ROW_NUMBER()分配递增数字,如下所示。

;WITH cte 
     AS (SELECT dt, 
                Row_number() 
                  OVER( 
                    ORDER BY (SELECT 1)) RN 
         FROM   (SELECT Cast('<X>' + Replace(F.f_key, ',', '</X><X>') 
                             + '</X>' AS XML) AS xmlfilter 
                 FROM   [lookup] F)F1 
                CROSS apply (SELECT fdata.d.value('.', 'varchar(500)') AS DT 
                             FROM   f1.xmlfilter.nodes('X') AS fdata(d)) O) 
SELECT P.* 
FROM   products P 
       LEFT JOIN cte C 
              ON C.dt = P.[key] 
ORDER  BY C.rn 

Online Demo

输出:

ID   F_KEY
-----------    
2    PFE
4    PFE
1    EGHS
3    EGHS
5    ABC

1
投票

你可以这样做:

SELECT ID, [KEY] FROM PRODUCTS
ORDER BY
CASE [KEY]
  WHEN 'PFE' THEN 1
  WHEN 'EGHS' THEN 2
  WHEN 'ABC' THEN 3
END
© www.soinside.com 2019 - 2024. All rights reserved.