关于T-SQL的多重IF-ELSE嵌套

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于T-SQL的多重IF-ELSE嵌套相关的知识,希望对你有一定的参考价值。

T-SQL中可以多重IF-ELSE嵌套吗?像java或是c#中那样,该如何实现?
if(boolean)
begin
if(boolean)
begin
**
end
end

像这样写报错 不知道怎么回事?

你写的时候,要按T-SQL的语法写就行了
IF boolean_expression
BEGIN
...

END

1、IF后面的布尔表达式是没有小括号的
2、IF-ELSE是可以嵌套的

例子1:
IF 1=1
BEGIN
PRINT 'TRUE'
END

例子2:
IF 1=1
BEGIN
IF 2=2
BEGIN
PRINT '2=2'

END
ELSE
BEGIN
PRINT '不是2=2'

END

END
ELSE
BEGIN
PRINT '不是1=1'

END
参考技术A 例如这样
USE pubs

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
BEGIN
PRINT 'The following titles are expensive mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END

当然你可以让它print‘fasdfsd’其他的就是你的运用了
参考技术B IF...ELSE
在执行 Transact-SQL 语句时强加条件。如果条件满足(布尔表达式返回 TRUE 时),则在 IF 关键字及其条件之后执行 Transact-SQL 语句。可选的 ELSE 关键字引入备用的 Transact-SQL 语句,当不满足 IF 条件时(布尔表达式返回 FALSE),就执行这个语句。

语法
IF Boolean_expression
sql_statement | statement_block
[ ELSE
sql_statement | statement_block ]

参数
Boolean_expression

是返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。

sql_statement | statement_block

Transact-SQL 语句或用语句块定义的语句分组。除非使用语句块,否则 IF 或 ELSE 条件只能影响一个 Transact-SQL 语句的性能。若要定义语句块,请使用控制流关键字 BEGIN 和 END。如果在 IF...ELSE 块的 IF 区和 ELSE 区都使用了 CREATE TABLE 语句或 SELECT INTO 语句,那么 CREATE TABLE 语句或 SELECT INTO 语句必须指向是相同的表名。

注释
IF...ELSE 结构可以用在批处理中,存储过程中(经常使用这种结构测试是否存在着某个参数),以及特殊查询中。

可以在其它 IF 之后或在 ELSE 下面,嵌套另一个 IF 测试。对于嵌套层数没有限制。

示例
A. 使用一个 IF...ELSE 块
下面的示例显示带有语句块的 IF 条件。如果书的平均价格不低于 $15,那么就显示文本:Average title price is more than $15.

USE pubs

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
PRINT 'Average title price is more than $15.'

下面是结果集:

The following titles are excellent mod_cook books:

Title
-----------------------------------
Silicon Valley Gastronomic Treats
The Gourmet Microwave

(2 row(s) affected)

B. 使用多个 IF...ELSE 块
下面的示例使用了两个 IF 块。如果书的平均价格不低于 $15,那么就显示文本:Average title price is more than $15。如果现代烹调书的平均价格高于 $15,则显示现代烹调书价格昂贵的语句。

USE pubs

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
BEGIN
PRINT 'The following titles are expensive mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
答案补充 (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
这句本身就是 BOOL类型,你也可以换成一个参数呀.

关于 Where 子句的 T-Sql 多重标准

【中文标题】关于 Where 子句的 T-Sql 多重标准【英文标题】:T-Sql Multiple Criteria On Where Clause 【发布时间】:2010-06-01 11:21:49 【问题描述】:

场景

我使用的是 SQL Server 2005 我有一个 T-Sql 查询,它有多个条件来搜索 WHERE 子句。 我敢肯定,我这样做的效率很低,而且很长。 如何确保不必手动输入所有条件? 相反,我想通过 SELECT * 子句传递条件。

当前查询代码

SELECT * FROM tblBooks
WHERE BookID = 1
OR BookID = 4
OR BookID = 5
OR BookID = 7
OR BookID = 8
OR BookID = 11
OR BookID = 14

建议的 PSEUDO 查询代码

SELECT * FROM tblBooks
WHERE BookID = (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction') 

代码注释

正如您从提议的伪代码中看到的那样,其想法是从另一个查询中选择 BookID 列表,并将此条件列表传递给实际查询本身。 我该如何正确地做到这一点?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

你在找这样的东西吗

SELECT * FROM tblBooks
WHERE BookID in (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction') 

如果存在书籍 ID,这将返回表 tblAuthors 中的所有数据

【讨论】:

【参考方案2】:

你的伪代码,不是太伪。将 = 更改为 IN 即可。

SELECT * FROM tblBooks 
WHERE BookID IN (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction')

【讨论】:

【参考方案3】:

使用连接:

SELECT  b.*
FROM    tblBooks b
        INNER JOIN
                tblAuthors a
                ON b.BookID = a.BookID
WHERE   a.Genre = 'Fiction'

我假设这些不是你真正的桌子?我不明白为什么 Genre 属性不在书本身上。许多作者跨多种体裁写作(以 Iain Banks 为例)。

【讨论】:

书籍属于流派作者以流派写作,所以我会将流派作为自己的表,其中包含书籍和流派之间的连接表(假设一本书可以在多种类型中,即使这不是典型的)以及作者和类型。 是的,一个单独的流派查找表当然是明智的,在作者和流派之间有一个链接表。不确定书籍...【参考方案4】:

只是把替代品扔在那里:

SELECT tblBooks.* 
  FROM tblBooks 
 WHERE EXISTS (SELECT *
                 FROM tblAuthors 
                WHERE tblBooks.BookID = tblAuthors.BookID
                  AND tblAuthors.Genre = 'Fiction');

SELECT tblBooks.*
  FROM tblBooks
 WHERE tblBooks.BookID = ANY
(SELECT tblAuthors.BookID
   FROM tblAuthors
  WHERE tblAuthors.Genre = 'Fiction');

【讨论】:

以上是关于关于T-SQL的多重IF-ELSE嵌套的主要内容,如果未能解决你的问题,请参考以下文章

1.基本选择结构if 2.逻辑运算符 3.if-else 4.多重if选择结构 5.嵌套if选择结构

关于 Where 子句的 T-Sql 多重标准

java的选择结构

Java 基本语法---流程控制

关于多重嵌套的JSON数据解析

多重if-else语句