1

假设我有一张像这样的桌子:

0表示现金,任何其他值表示check serial number

ID    NAME     PaymentMethod       Amount          Bank
------------------------------------------------------------
1     Alex          0               20             ''
2     Sara       123456789         5000      Bank of America
3     Mina          0               15             ''
4     Scott      987456321        10000         Citibank

如何使用IF语句,以便如果该PaymentMethod列包含0我隐藏该列,而是显示一个值为 of 的列Incash并隐藏银行列。

PaymentMethod还有其他内容时,我只需将列标题重命名为CheckSerial.

为了更清楚,我希望表格看起来像这样;对于那些已经付款的人InCash,它显示为:

ID    NAME       PaymentMethod       Amount  
-------------------------------------------
1     Alex          InCash            20  
3     Mina          InCash            15        

对于那些通过支票支付的人,它显示为:

ID    NAME   PaymentMethod  Serial Number     Amount          Bank
-------------------------------------------------------------------
2     Sara      Check        123456789        5000      Bank of America
4     Scott     Check        987456321        10000         Citibank

我尝试了这样的事情,根据给定的 ID,只有一个 select 语句执行:

    ALTER FUNCTION dbo.Function1(@IDTag bigint)
    RETURNS TABLE
    AS 
    if PaymentMethod = 0
    BEGIN  
    RETURN SELECT         ID, Name , PaymentMethod = InCash , Amount 
           FROM            tblTest
           WHERE        (ID = @IDTag)
           END
    ELSE 
           BEGIN 
           RETURN   SELECT        ID, Name , PaymentMethod ='By Check', PaymentMethod As [Serial number], Amount, Bank 
           FROM            tblTest
           WHERE        (ID = @IDTag)

           END

这甚至正确吗?如果这不可行或不合逻辑,您对此有何建议?

4

2 回答 2

4

您可以使用 CASE 语句显示“现金”或“支票”,如下所示。

select ID, NAME, 
    CASE PaymentMethod WHEN 0 THEN 'In cash' ELSE 'Check' END as PaymentMethod,
    Amount, Bank
from
    [mytable]

但是您不能隐藏单个结果集中的列,您需要运行两个查询

select ID, NAME, 'In cash' PaymentMethod, Amount
from [mytable] where PaymentMethod = 0

select ID, NAME, 'Check' PaymentMethod, SerialNumber, Amount, Bank
from [mytable] where PaymentMethod <> 0
于 2013-02-20T12:08:58.120 回答
2

你的代码不是一个好计划。调用程序无法知道数据会是什么样子。最好做一些像 Phil 展示的事情,你总是返回同一张表,但有时有些列没有被使用。

此外,您显示的 SQL 有许多拼写错误——您在 InCash 周围没有引号,并且在第二个查询中您有两次相同的列名 (PaymentMethod)。

这可能是您想要的查询:

SELECT ID, Name, 
    CASE WHEN PaymentMethod = 0 THEN 'In cash' ELSE 'Check' END as PayBy,
    -- NB we could just select PaymentMethod as SerialNumber here, but this is clearer.
    CASE WHEN PaymentMethod != 0 THEN PaymentMethod ELSE 0  END as SerialNumber,
    Amount, Bank
FROM [mytable]
于 2013-02-20T13:14:45.943 回答