3

クエリに日時列があり、このクエリでCASEを実行したいと思います。

DateDelivered列がnullでない場合は、日付を表示します。それ以外の場合は、文字列「Pendent」を表示します。どうすればよいですか?

CASE WHEN DateDelivered IS NOT NULL THEN DateDelivered ELSE 'Pendent' END AS DateDelivered 2

このエラーが発生しました

Conversion failed when converting date and/or time from character string.

クエリ全体

SELECT  San_Imovel.Imovel_Id ,
        San_Chave.DataHoraPegou ,
        CASE WHEN San_Chave.DateDelivered IS NOT NULL THEN San_Chave.DateDelivered
             ELSE ISNULL(CAST(San_Chave.DateDelivered AS VARCHAR), 'Pendent')
        END AS DateDelivered2 ,
        San_Usuario.NomeCompleto + ' - ' + sc.Apelido AS Nome ,
        San_Cliente.NomeCompleto AS NomeCliente ,
        San_Credenciada.Apelido ,
        San_Cliente.Cliente_Id ,
        San_ChaveImovel.QuantidadeChave
FROM    San_ChaveImovel
        JOIN San_Chave ON San_ChaveImovel.Chave_Id = San_Chave.Chave_Id
        JOIN San_Credenciada ON San_Chave.Credenciada_Id = San_Credenciada.Credenciada_Id
        JOIN San_Imovel ON San_ChaveImovel.Imovel_Id = San_Imovel.Imovel_Id
        JOIN San_Usuario ON San_Chave.Usuario_Id_Responsavel = San_Usuario.Usuario_Id
        JOIN San_Credenciada sc ON San_Usuario.Credenciada_Id = sc.Credenciada_Id
        JOIN San_Cliente ON San_Chave.Cliente_Id = San_Cliente.Cliente_Id  
4

2 に答える 2

6

'Pendent'をDateTimeに変換しようとしています。これは、すべてのデータを同じデータ型に変換するためです。また、NULLをチェックするだけの場合は、ISNULLまたはCOALESCEを使用できます。これを試して:

ISNULL(CAST(DateDelivered AS VARCHAR), 'Pendent')

DateDeliveredの形式を指定することもできます。

ISNULL(CONVERT(VARCHAR, DateDelivered, 101), 'Pendent')

101のその他のオプションについては、こちらをご覧ください。

于 2012-04-26T16:51:41.357 に答える
2

CASE演算子によって返される値は、最初の結果句と同じタイプおよびサイズです。'Pending'をDateTime値に変換できないため、日付値をそれらのvarchar表現に変換する必要があります。

CASE WHEN DateDelivered IS NOT NULL THEN CONVERT(VARCHAR(10), DateDelivered, 120)
ELSE 'Pendent'
END AS DateDelivered 

ISNULLこの例では、 :を使用して同じ結果を得ることができます。

ISNULL(CONVERT(VARCHAR(10), DateDelivered, 120), 'Pending') AS [DateDelivered]

注1:日付値をvarcharに変換するときYYYY-MM-DDは、あいまいな形式ではないため、常に順序を優先します。

注2:誤用CASEにより、最初の結果句のサイズに基づいてvarchar値が切り捨てられると、より微妙なバグが発生する可能性があることに注意してください。

CASE WHEN 1=0 THEN 'A'
ELSE 'BBB'
END -- returns only 'B' !!!
于 2012-04-26T17:43:24.350 に答える