我正在尝试创建一个存储过程,该过程采用一个位参数,如果一个列为true,另一个列为false。我该如何实现?
这是我到目前为止所拥有的
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
END
GO
答案 0 :(得分:15)
ORDER BY
CASE WHEN @switch = 0 THEN Field1 END,
CASE WHEN @Switch = 1 THEN Field2 END
答案 1 :(得分:3)
粗暴的方式:
IF @switch = 1
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY acct_nbr
END
ELSE
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY acct_name
END
你也应该能够使用CASE..WHEN我想:
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
CASE @switch
WHEN 1 THEN acct_nbr
WHEN 0 THEN acct_name
END
答案 2 :(得分:3)
一种方法是建立像这样的查询:
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
DECLARE
@SQL nvarchar(max)
SET @SQL N'SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY '
if(@switch)
BEGIN
@SQL = @SQL + ' acct_nbr '
END
ELSE
BEGIN
@SQL = @SQL + ' acct_Name '
END
Exec SP_ExecuteSQL @SQL
答案 3 :(得分:2)
我不确定你能不能?我最终会这样做:
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
if @switch
begin
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
acct_nbr
end
else
begin
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
acct_name
end
END
GO
答案 4 :(得分:1)
我认为您可以将参数更改为int,并按照该序号进行排序:
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@ordinal AS INT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY @Ordinal
END
GO
这会引发一个很好的错误(SQL2005):
Msg 1008,Level 16,State 1,Line 4 SELECT标识的SELECT项 ORDER BY number 1包含一个变量 作为表达识别的一部分 列位置。变量只是 通过表达式排序时允许 引用列名。
谷歌搜索找到this solution here(SQL 2005及以上版本):
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY CASE
WHEN @switch = 0 THEN (RANK() OVER (ORDER BY acct_nbr, acct_name))
WHEN @switch = 1 THEN (RANK() OVER (ORDER BY acct_name, acct_nbr))
END
GO
答案 5 :(得分:0)
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY case @switch when 1 then acct_name else acct_nbr end
答案 6 :(得分:0)
最简洁的方法是:
CREATE PROCEDURE [dbo].[CLICK10_GetCP]
@switch AS BIT
AS
BEGIN
SELECT
acct_nbr,
acct_name
FROM
acct
ORDER BY
case @switch
when 1 then acct_nbr
when 0 then acct_name
end
END
GO
这可能会导致较大表的执行计划不佳,或者如果acc-nbr是int且acct-name是varchar,它可能根本不起作用。
在IF / ELSE语句中包装两个单独的查询可能对较大的数据集执行明显更好,或者如果两列的数据类型不同,则是唯一可行的方法。