大家好我在oracle中查询如下
DECLARE in_variable Varchar;
Select Row_Number()
OVER
(
Order By
Decode(in_variable,'column_name ASC',t.column_name) Asc) b
From table t
转换为sql server,如下所示
DECLARE @in_variable NVARCHAR(100)
SELECT ROW_NUMBER() OVER
(
ORDER BY
IIF ( @in_sort_by <> '', 'column_name ASC', t.column_name ) ASC )
FROM table t
这是正确的吗?或者当我给出@in_variable
的值时我做错了我在sql中得到转换异常所以可以帮助我
答案 0 :(得分:1)
您可以更好地使用DECODE
,而不是使用IIF
或CASE
。对于SQL Server,这将是:
SELECT ROW_NUMBER() OVER
( ORDER BY
CASE WHEN @in_sort_by <> ''
THEN 'column_name ASC'
ELSE t.column_name END ASC )
FROM table t
如果您收到类型转换错误,则表示t.column_name
为int
。 SQL Server将尝试转换静态字符串'column_name ASC'
以匹配正在使用的列的数据类型。要解决此问题,您可以尝试使用CAST
将列转换为VARCHAR
:
SELECT ROW_NUMBER() OVER
( ORDER BY
CASE WHEN @in_sort_by <> ''
THEN 'column_name ASC'
ELSE CAST(t.column_name as varchar) END ASC )
FROM table t
但是,我认为你可能在这里寻求错误的解决方案。您似乎正在尝试根据提供的变量对分析函数进行不同的排序。将备用列名称和排序顺序作为字符串提供不会这样做。您应该查看与dynamic sorting相关的问题,了解如何正确执行此操作。