我有一个在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子句中起作用,但我需要一个标志,这意味着我必须联合UNION 2选择。这实际上是一个连接的一部分,它是一个更大的语句中的子查询,所以我不想这样做。我曾试图以tax_type = cast('W' as varchar(2))
的方式拼写无效。如果我使用ISNULL(tax_type,'x')
,则结果相同。
我不知道为什么平等测试不起作用,有人可以提供指导吗?
答案 0 :(得分:2)
您不能在SQL 2005中使用IIF
,因为IIF仅是SQL 2012函数
您需要使用CASE
SELECT CASE tax_type WHEN 'W' THEN 1 ELSE 0 END FROM dbo.ap_purchases_tax_det
答案 1 :(得分: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语句或MS Access中的SELECT CASE,这实际上不是一般条件。
的两个重要说明IIF是撰写CASE声明的简便方法 IIF被翻译成CASE的事实......
所以当你写
IIF ( {condition} , {true} , {false} )
SQL Server查询优化器实际上看到了
CASE WHEN {condition} THEN {true} ELSE {false} END
仅供参考您可以使用此
完全避免使用CASE语句SELECT 1-sign(abs(ascii('W')-ascii(tax_type+'.')))
只是一个想法。