假设我有一个包含以下列的表:
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
提前致谢。
答案 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