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 个选择联合起来。这实际上是连接的一部分,它是更大语句中的子查询,所以我不想这样做。我试过明确地投射tax_type = cast('W' as varchar(2))无济于事。如果我使用相同的结果ISNULL(tax_type,'x')

我不知道为什么平等测试不起作用,有人可以提供指导吗?

4

2 回答 2

2

您不能IIF在 SQL 2005 中使用,因为IIF只是 SQL 2012 函数

你需要使用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 语句或 MS Access 中的 SELECT CASE,这并不是真正的一般条件。

关于IIF (Transact-SQL) 的两个重要说明

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+'.')))

只是一个想法。

于 2012-10-03T10:24:31.203 回答