基于列的排序

ORDER BY BASED ON COLUMN

我有两个 table,PRODUCTS AND LOOKUP TABLES.Now 我想根据 LOOKUP TABLE 中的 KEY 列值订购产品 table 中的 KEY 列。

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 table.

中的 KEY (PFE,EGHS,ABC) 值对 PRODUCTS table 中的记录进行排序

示例输出:

产品

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

我使用这个查询,但它不起作用

SELECT * 
FROM PRODUCTS 
ORDER BY (SELECT F_KEY FROM LOOKUP)

您可以使用 XML 拆分字符串。您首先需要将字符串转换为 XML 并将逗号替换为开始和结束 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

你可以这样做:

SELECT ID, [KEY] FROM PRODUCTS
ORDER BY
CASE [KEY]
  WHEN 'PFE' THEN 1
  WHEN 'EGHS' THEN 2
  WHEN 'ABC' THEN 3
END