MYSQL:用户即时选择的 ORDER BY table
MYSQL: ORDER BY table selected on the fly by user
我有一个 table 这样的:
Table:列数
col1 col2 col3 col4
------ ------ ------ -------
1 2 5 8
5 4 2 7
5 3 7 4
7 5 4 1
用户选择什么样的排序列非常重要,我尝试这样的事情:
SELECT col1,Col2,Col3
FROM Cols
order by cast(:ORDER_ID_COL as integer)
或
SELECT col1,Col2,Col3
FROM Cols
order by cast(:ORDER_ID_COL as varchar(20))
两者都没有错误,但 none 正确。
如有不妥之处,请赐教让我重回正轨。
试试 :::
DECLARE @OrderBy VARCHAR(10) = '/*Here, pass the column name(if multiple columns, pass column names separated by commas)*/'
DECLARE @SQLquery VARCHAR(MAX) = '
SELECT col1,Col2,Col3
FROM Cols
order by ' + @OrderBy
EXEC (@SQLquery)
当您将 :ORDER_ID_COL
传递给 sql 时,它将被视为一个值而不是列,因此它不会产生您想要的顺序,换句话说,您的查询如下所示:
SELECT col1,Col2,Col3
FROM Cols
order by 'col1'
你可以使用一种丑陋的方式来做到这一点:
SELECT col1,Col2,Col3
FROM Cols
order by case when :ORDER_ID_COL = 'col1' then col1
when :ORDER_ID_COL = 'col2' then col2
when :ORDER_ID_COL = 'col3' then col3
when :ORDER_ID_COL = 'col4' then col4
end
或使用动态sql:
SET @sql = concat('select col1,Col2,Col3 from cols order by ', :ORDER_ID_COL);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我有一个 table 这样的:
Table:列数
col1 col2 col3 col4
------ ------ ------ -------
1 2 5 8
5 4 2 7
5 3 7 4
7 5 4 1
用户选择什么样的排序列非常重要,我尝试这样的事情:
SELECT col1,Col2,Col3
FROM Cols
order by cast(:ORDER_ID_COL as integer)
或
SELECT col1,Col2,Col3
FROM Cols
order by cast(:ORDER_ID_COL as varchar(20))
两者都没有错误,但 none 正确。
如有不妥之处,请赐教让我重回正轨。
试试 :::
DECLARE @OrderBy VARCHAR(10) = '/*Here, pass the column name(if multiple columns, pass column names separated by commas)*/'
DECLARE @SQLquery VARCHAR(MAX) = '
SELECT col1,Col2,Col3
FROM Cols
order by ' + @OrderBy
EXEC (@SQLquery)
当您将 :ORDER_ID_COL
传递给 sql 时,它将被视为一个值而不是列,因此它不会产生您想要的顺序,换句话说,您的查询如下所示:
SELECT col1,Col2,Col3
FROM Cols
order by 'col1'
你可以使用一种丑陋的方式来做到这一点:
SELECT col1,Col2,Col3
FROM Cols
order by case when :ORDER_ID_COL = 'col1' then col1
when :ORDER_ID_COL = 'col2' then col2
when :ORDER_ID_COL = 'col3' then col3
when :ORDER_ID_COL = 'col4' then col4
end
或使用动态sql:
SET @sql = concat('select col1,Col2,Col3 from cols order by ', :ORDER_ID_COL);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;