来自其他表的SQL if子查询

来自其他表的SQL if子查询,sql,sql-server,Sql,Sql Server,我有一个查询,它有相当多的约束并返回项。 Items表如下所示(简化): 然后我有一个表架,其中有字段: Item_id | Price 我从外部服务收到的代码(code项目中的列)不应出现在结果中: (code NOT IN ('" + Joiner.on("', '").join(codesToSkip) + "') 现在我需要更改它,这样,如果Item\u id在表shelfs中,我就不会考虑从externla服务收到的codesToSkip 因此,总结一下: 1.如果Item\u

我有一个查询,它有相当多的约束并返回项。 Items表如下所示(简化):

然后我有一个表架,其中有字段:

Item_id | Price 
我从外部服务收到的代码(
code
项目中的列)不应出现在结果中:

(code NOT IN ('" + Joiner.on("', '").join(codesToSkip) + "')
现在我需要更改它,这样,如果
Item\u id
在表
shelfs
中,我就不会考虑从externla服务收到的
codesToSkip

因此,总结一下: 1.如果
Item\u id
shelfs
中,则跳过关于
code

  • 如果不是,则必须使用
    code
    约束
  • 编辑: 立即查询:

    SELECT * FROM Items WHERE Items.code NOT IN ("XX", "WWW")
    
    更改后的查询:

    SELECT * FROM Items WHERE (Items.code NOT IN ("XX", "WWW") OR Items.id IN Shelves.Item_id) 
    
    • 这里有一个问题——我想把它变成一个if语句——如果Items中的Item.id在shelfs中,那么就删除Items.code的约束

    我们可以在非常简单的where子句中使用
    EXISTS

    SELECT
      * --TODO, explicit column list
    FROM Items i
    WHERE EXISTS (SELECT * FROM Shelves s where s.Item_ID = i.ID)
    OR Code NOT IN (1,4,5)
    
    希望您可以很容易地看到,如果商品在货架上,则无论
    代码是什么,只有当它不在货架上时,才与
    code
    是否包含在我们要避免的代码列表中相关



    顺便说一句,您应该避免在SQL中使用双引号作为字符串文本。字符串文字的正确分隔符是单引号。SQL Server有时会允许双引号,但我不建议依赖这种行为。

    让您的帮助变得容易:您的dbms是什么?我们正在使用SQL Server
    SELECT
      * --TODO, explicit column list
    FROM Items i
    WHERE EXISTS (SELECT * FROM Shelves s where s.Item_ID = i.ID)
    OR Code NOT IN (1,4,5)