在SQL Update案例中需要if / else语句

时间:2012-02-06 17:32:07

标签: mysql sql vb.net case

如何使用一个案例不同的Update语句更新数据库中的多个记录。

refundNumber = CASE _
WHEN salesRecords.invNo='1' AND itemNo='250' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88' _
WHEN salesRecords.invNo='1' AND itemNo='7095' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88'  _
END

这失败了,应该是这样的:

refundNumber = CASE _
WHEN invNo='1' AND itemNo='250' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' )  _
WHEN invNo='1' AND itemNo='7095' AND length(refundNumber) > 1 THEN _
concat(refundNumber, ', 88' ) Else '88'  _
END

不同之处在于Else最后才出现。

但它将所有记录的refundNumber设置为88。

我要做的是将名为refundNumber的字段的值添加到invNo = 'currentInvoiceNumber'itemNo = 'itemNumber'

的项目中

但是,由于refundNumber是一个包含逗号分隔列表的文本字段,我试图确定该字段是否为空,如果是,只需输入数字,如果它不是然后,将逗号前面的数字附加到现有字段内容。因此length(refundNumber) > 1 THEN concat(refundNumber, ', 88' )位。

我没有测试过,但我相信我需要的VB逻辑是:

IF invNo='1' And itemNo='250' THEN
    IF length(refundNumber) > 1 THEN 
        concat(refundNumber, ', 88' )  
    ELSE
        '88'
    END IF
ELSE IF invNo='1' And itemNo='7095' THEN        
    IF length(refundNumber) > 1 THEN 
        concat(refundNumber, ', 88' )  
    ELSE
        '88'
    END IF
Else
    refundNumber '- leave the field value as is because it does not comply with any of the above conditions
END IF

我怎样才能将其翻译为SQL CASE字符串?

3 个答案:

答案 0 :(得分:2)

如果您不想更新InvNo不为“1”且itemNo不是“250”或“7095”的记录,为什么没有where子句将该限制设置为此条件?然后,您需要使用案例表达式连接退款编号和88,但您甚至不需要使用以下内容:

UPDATE yourtable
SET refundNumber = ISNULL(CONCAT(NULLIF(refundNumber, ''), ', 88'), '88')
WHERE InvNo = '1'
AND itemNo in ('250', '7095')

或者使用嵌套的case表达式?

答案 1 :(得分:0)

试试这个:

refundNumber = CASE _
WHEN invNo='1' AND itemNo='250' THEN _
    CASE WHEN length(refundNumber) > 1 THEN concat(refundNumber, ', 88' )  _
    ELSE '88' END
WHEN invNo='1' AND itemNo='7095' THEN _
    CASE WHEN length(refundNumber) > 1 THEN concat(refundNumber, ', 88' ) _
    Else '88' END
END

答案 2 :(得分:0)

如果你要用case来做,试试这个,但GarethD使用WHERE子句的答案可能更好

refundNumber = CASE WHEN (invNo='1' AND itemNo='250')
                Or (invNo='1' AND itemNo='7095')
                THEN
                   CASE WHEN length(refundNumber) > 1 
                   THEN concat(refundNumber, ', 88' )
                   ELSE '88'
                   END
                ELSE refundnumber
           END