按TableName和columnname排序

时间:2017-07-04 12:11:27

标签: sql sql-server

假设我有一个包含以下列的表:

Id,TableName,Columnname

通常情况下,如果我想在 TableName 主要和 ColumnName 辅助中进行排序,我会做

Select * From MyTable Order By TableName,ColumnName

现在说我想要根据TableName

进行排序的特殊情况
Select * From MyTable Order By Case
When TableName = 'Foo' Then '1'
When TableName = 'Bar' Then '2'
When TableName = 'Test' Then '3'
ELSE 1000 END;

如何将第二种备选方案与第一种备选方案相结合,即对第一个TableName进行特殊排序,然后使用该TableName对Columnnames进行排序?

我正在运行Microsoft SQL

提前致谢。

3 个答案:

答案 0 :(得分:1)

只需在订单列表中添加列,就像其他任何ORDER BY:)

一样
Select * From MyTable Order By Case
When TableName = 'Foo' Then '1'
When TableName = 'Bar' Then '2'
When TableName = 'Test' Then '3'
ELSE 1000 END, ColumnName;

答案 1 :(得分:0)

case方法很好。我经常使用这个捷径:

Select *
From MyTable
Order By charindex(TableName, ',Test,Bar,Foo,') desc

这有点神秘。 charindex()返回字符串中名称的位置。因此,此表单不适用于所有字符串值,但可以推广:

Order By charindex(',' + TableName + ',', ',Test,Bar,Foo,') desc

列表的反转是处理缺失值。这些值被赋值为0,因此通过以相反的顺序放置值,丢失的值最后。请注意,如果我知道所有值,那么我会将其写为:

Order By charindex(TableName, ',Foo,Bar,Test,') asc

答案 2 :(得分:0)

作为替代方案,您可以

1)创建一个新表

CREATE TABLE_ORDER (TABLE_NAME VARCHAR(100) NOT NULL, ORDER_VAL INT);
ALTER TABLE TABLE_ORDER ADD CONSTRAINT TABLE_ORDER_PK PRIMARY KEY(TABLE_NAME);

2)在其中插入适当的值:

 INSERT INTO TABLE_ORDER (TABLE_NAME, ORDER_VAL) VALUES ('Foo', 1);
 INSERT INTO TABLE_ORDER (TABLE_NAME, ORDER_VAL) VALUES ('Bar', 2);
 INSERT INTO TABLE_ORDER (TABLE_NAME, ORDER_VAL) VALUES ('Test', 3);

3)使用以下查询

   SELECT A.* 
   FROM MYTABLE A
   LEFT JOIN TABLE_ORDER B ON A.TABLENAME= B.TABLE_NAME
   ORDER BY B.ORDER_VAL, A.COLUMNNAME