1

次のように定義された SQL Server 2005 で実行されている単純なテーブルがあります。

CREATE TABLE [dbo].[ap_purchases_tax_det](
[invoice_s] [int] NOT NULL,
[line_num] [smallint] NOT NULL,
[tax_code] [varchar](10) NOT NULL,
[tax_type] [varchar](2) NULL,
[tax_det_s] [int] IDENTITY(1,1) NOT NULL,
[old_entity] [varchar](14) NULL,
[old_cc_code] [varchar](5) NULL,
[old_vendor] [varchar](15) NULL,
[old_invoice] [varchar](20) NULL,
[citi] [varchar](1) NULL,
CONSTRAINT [aaaaaap_purchases_tax_det_PK] PRIMARY KEY NONCLUSTERED 
(
    [invoice_s] ASC,
    [line_num] ASC,
    [tax_code] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

tax_type フィールドには、「W」、「V」、「B」、または「」が入力されます (これは NULL ではありません)。

tax_type が「W」の場合、ブール値のフラグを取得する必要があるため、次の SQL があります。

select iif(tax_type = 'W',1,0) FROM dbo.ap_purchases_tax_det;

これを実行すると、「'=' 付近の構文が正しくありません。」というメッセージが表示されます。これは単純なtax_type = 'W'. 等しいかどうかのテストは WHERE 句で機能しているようですが、フラグが必要です。つまり、2 つの選択を一緒に UNION する必要があります。これは実際には、はるかに大きなステートメントのサブクエリである結合の一部であるため、これを行いたくありません。私は明示的にキャストしようとしましたが、役に立ちtax_type = cast('W' as varchar(2))ませんでした。を使用しても同じ結果になりますISNULL(tax_type,'x')

平等のテストが機能しない理由がわかりません。誰かがガイダンスを提供できますか?

4

2 に答える 2

2

IIFはSQL2012関数のみであるIIFため、 SQL2005では使用できません。

あなたが使用する必要がありますCASE

 SELECT CASE tax_type WHEN 'W' THEN 1 ELSE 0 END FROM dbo.ap_purchases_tax_det
于 2012-10-03T10:13:12.407 に答える
1

通常、SQL Server 2012より前は、このようにIIFを記述してください。

select case when tax_type = 'W' then 1 else 0 end
FROM dbo.ap_purchases_tax_det;

CASEステートメントには別の形式がありますが、これはC#/JavaのSWITCHステートメントやMSAccessのSELECTCASEに似ており、実際には一般的な条件ではありません。

IIF(Transact-SQL)に関する2つの重要な注意事項

IIFは、CASEステートメントを作成するための簡単な方法です。
IIFがCASEに変換されるという事実...

だからあなたが書くとき

IIF ( {condition} , {true} , {false} )

SQLServerクエリオプティマイザは文字通り

CASE WHEN {condition} THEN {true} ELSE {false} END

参考までにこれを使用すると、CASEステートメントを完全に回避できます

SELECT 1-sign(abs(ascii('W')-ascii(tax_type+'.')))

ちょっとした考え。

于 2012-10-03T10:24:31.203 に答える