Select Query SQL Server 中的 IF 子句用法

Posted

技术标签:

【中文标题】Select Query SQL Server 中的 IF 子句用法【英文标题】:IF Clause usage in Select Query SQL Server 【发布时间】:2017-09-07 10:42:39 【问题描述】:

我想在 SELECT 查询中使用 IF 语句。这是示例。 我有 3 个表格,其中保存客户信息、型号信息和库存。我想为每个客户提供最合适的模型。因此,在我的第一次尝试中,如果客户收入低于 5000,我想提供该商店中存在的廉价型号,否则该商店中的任何型号。 但我不能在 SELECT WHERE 部分使用 IF clouse。

SELECT  TOP 1 @vmodel  = stocks.model , @vsloc = stocks.sloc , @vyear = models.year , @vcost = models.cost <br>FROM bistore.dbo.stocks 
JOIN bistore.dbo.models
ON stocks.model = models.model 
WHERE stocks.sloc<>'Main'
AND stocks.stock > 0 
AND models.mat IN (
IF (@vincome<5000) SELECT DISTINCT mat from models where mat<>'Carbon' 
ELSE SELECT DISTINCT mat from models 
)   /* If income is less than 5000 than chose cheap models , else whatever ) */

** 更新 ** 当客户登录我的门户网站时,我想为他/她提供最适合他的模型。我会检查他的收入,在他附近储存库存并在横幅上提供给他。这是我的表格样本。

CustomerInfo

ModelInfo

声明@vcname VARCHAR(50) 声明 @vckids INT 声明 @vceng INT 声明 @vcweig INT 声明 @vcincome INT 声明 @vyear INT 声明 @vcost INT

SELECT TOP 1 @vcname = nmsnm , @vckids = kids , @vcleng = leng, @vcweig = weig , @vcincome = 来自客户的收入 ORDER BY id DESC 声明 @vmodel VARCHAR(50) 声明 @vsloc VARCHAR(50) SELECT TOP 1 @vmodel = stock.model ,@vsloc = stock.sloc ,@vyear = models.year ,@vcost = models.cost FROM bistore.dbo.stocks 加入 bistore.dbo.models ON stock.model = models.model WHERE stock.sloc'主要' AND stock.stock > 0 AND models.mat IN ( IF (@vincome'Carbon' END ELSE BEGIN SELECT DISTINCT mat from models END ) /* 如果收入低于 5000 比选择便宜的型号,否则随便 ) / AND models.frames IN (SELECT frames from models where frames 选择适合长度的模型/ AND models.type 'Kids Bike' / 如果有孩子,随便选(不大于长度)*/ 按 NEWID() 排序

【问题讨论】:

你能给我们一些样本数据和预期结果吗 【参考方案1】:

您不需要IFCASE,只需要一个额外的AND 和一个反向的@vincome 支票:

SELECT TOP 1 
       @vmodel = stocks.model , 
       @vsloc =  stocks.sloc , 
       @vyear =  models.year , 
       @vcost = models.cost <br> 
FROM   bistore.dbo.stocks 
JOIN   bistore.dbo.models 
ON     stocks.model = models.model 
WHERE  stocks.sloc <>'Main' 
AND    stocks.stock > 0 
AND ( @vincome >= 5000 OR models.mat <> 'Carbon' )

您发现您甚至不需要子查询。

【讨论】:

【参考方案2】:

mysql 中是 CASE 语句,其详细信息为 here。

一种可能的用法(请参阅您的对象以了解正确的语法):

SELECT  TOP 1 @vmodel  = stocks.model , @vsloc = stocks.sloc , @vyear = models.year , @vcost = models.cost <br>FROM bistore.dbo.stocks 
JOIN bistore.dbo.models
ON stocks.model = models.model 
WHERE stocks.sloc<>'Main'
AND stocks.stock > 0 
AND models.mat IN (
    CASE sign(@vincome - 5000)
       WHEN -1 then (SELECT DISTINCT mat from models where mat<>'Carbon')
       ELSE '(SELECT DISTINCT mat from models ) 
    END
    )   /* If income is less than 5000 than chose cheap models , else whatever ) */

PS:符号是我用来模仿更大/相等/更小的控制以更好地理解 CASE 语法的技巧。

【讨论】:

以上是关于Select Query SQL Server 中的 IF 子句用法的主要内容,如果未能解决你的问题,请参考以下文章

Sql Query 列出 SQL Server 2005 数据库中的所有视图

SQL SERVER 查询 Oracle

Flink SQL Query 语法(一)

SQL Server 2008R2 用户定义函数(表值)性能

SQL Select Query 中 Top 1 1 和 Select 1 之间的差异

SQL Server 中的 XML 查询