Oracle转换为sql for DECODE

时间:2014-11-13 15:08:55

标签: oracle-sqldeveloper sql-server-2014

大家好我在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中得到转换异常所以可以帮助我

1 个答案:

答案 0 :(得分:1)

您可以更好地使用DECODE,而不是使用IIFCASE。对于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_nameint。 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相关的问题,了解如何正确执行此操作。