CASE,WHEN和THEN只保持返回0或1,而不是字符串

时间:2014-07-29 15:14:08

标签: sql-server tsql

我的存储过程返回了要在引用中使用的数据。可选的最低费用。用户可以设置最低费用。但是,对于要应用的最低费用,用户需要选中一个表示应用最低费用的框。我有3个案例我想跟踪。

  1. 如果设置了最低费用,则选中复选框,最低费用优于总费用,这意味着已应用最低费用。在这种情况下,请返回1。
  2. 如果最小值优于总数,但未选中复选框,这意味着即使最小费用为总数,也不会应用最小费用。在这种情况下,返回2.
  3. 否则,返回0.
  4. 这是我负责该逻辑的存储过程的一部分。

    ,CASE
        WHEN (ISNULL(PT.TranslationMasterTaskID, 0) > 0) 
             AND PTM.UseMinClientCharge = 1  
             AND (PTM.MinClientCharge > COALESCE(PT.RoundedClientTotal,0))
             THEN 1
        WHEN (ISNULL(PT.TranslationMasterTaskID, 0) > 0) 
             AND PTM.UseMinClientCharge = 0  
             AND (PTM.MinClientCharge > COALESCE(PT.RoundedClientTotal,0))
             THEN 2
        ELSE 0  
      END AS MinClientChargeWarning 
    

    我不明白为什么不显示2结果。即使我确定它应该。我试图将1,2和3改为' 1',' 2'和' 3',但我仍然获得 1 0

    有什么理由,我只能 0 1

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

所以运行以下示例查询。您会注意到返回所有三个值。将UseMinClientCharge更改为BIT,您会发现只返回两个。

原因是BIT隐式地将0(false)以外的任何值转换为1(true)。

我们当然可以调整其他值来强制默认情况,但我怀疑这就是你所指的。

 -- Begin Sample Data

CREATE TABLE #PT (
RowID INT NOT NULL,
TranslationMasterTaskID INT NULL,
RoundedClientTotal INT NULL
)

CREATE TABLE #PTM (
RowID INT NOT NULL,
UseMinClientCharge  INT NULL,
MinClientCharge  INT NULL
)


INSERT INTO #PT
        ( RowID, TranslationMasterTaskID,RoundedClientTotal )
VALUES  ( 1,1,1 )
INSERT INTO #PT
        ( RowID, TranslationMasterTaskID,RoundedClientTotal )
VALUES  ( 2,1,1 )
INSERT INTO #PT
        ( RowID, TranslationMasterTaskID,RoundedClientTotal )
VALUES  ( 3,1,1 )


INSERT INTO #PTM
        ( RowID, UseMinClientCharge,MinClientCharge )
VALUES  ( 1,0,2 )
INSERT INTO #PTM
        ( RowID, UseMinClientCharge,MinClientCharge )
VALUES  ( 2,1,2 )
INSERT INTO #PTM
        ( RowID, UseMinClientCharge,MinClientCharge )
VALUES  ( 3,2,2 )

-- End Sample Data


SELECT CASE
    WHEN (ISNULL(PT.TranslationMasterTaskID, 0) > 0) 
         AND PTM.UseMinClientCharge = 1  
         AND (PTM.MinClientCharge > COALESCE(PT.RoundedClientTotal,0))
         THEN 1
    WHEN (ISNULL(PT.TranslationMasterTaskID, 0) > 0) 
         AND PTM.UseMinClientCharge = 0  
         AND (PTM.MinClientCharge > COALESCE(PT.RoundedClientTotal,0))
         THEN 2
    ELSE 0  
  END AS MinClientChargeWarning 
FROM #PT PT 
JOIN #PTM PTM ON (PTM.RowID = PT.RowID)


DROP TABLE #PT
DROP TABLE #PTM