AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 176480
Accepted
Jason
Jason
Asked: 2017-06-17 08:08:24 +0800 CST2017-06-17 08:08:24 +0800 CST 2017-06-17 08:08:24 +0800 CST

类似于比较两个集合的 'in' 的运算符

  • 772

我想比较两组值,看是否有交集。第一组值在运行时指定,第二组值存储在数据库的一行中。

下面是一些示例代码:

CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)

INSERT INTO #tab1 
VALUES (1,2,3),(0,0,0),(0,4,0)

Select
a = (case when 1 IN (var1,var2,var3) OR
               2 IN (var1,var2,var3) OR
               3 IN (var1,var2,var3)
    THEN 1 else 0 end) 
from #tab1

感觉代码太繁琐了,想知道有没有什么简单的方法可以实现。谢谢!

sql-server
  • 4 4 个回答
  • 310 Views

4 个回答

  • Voted
  1. BradC
    2017-06-17T08:39:31+08:002017-06-17T08:39:31+08:00

    您可以只JOIN对真实或动态派生的表:

    DECLARE @var1 INT=2;
    DECLARE @var2 INT=15;
    DECLARE @var3 INT=-7;
    
    IF EXISTS (SELECT 1 FROM 
                 (VALUES (1),(2),(3))tableNums(number)
                 INNER JOIN (VALUES (@var1), (@var2), (@var3))tableVars(var)
                 ON tableNums.number=tableVars.var
           )
        SELECT 1    --or do something else interesting
    ELSE SELECT 0   --or do the opposite
    

    如果列表很长,我可能会提前在#temp 表中创建它,而不是在语句中创建它,但是JOIN和EXISTS逻辑是相同的。


    同样,我们可以使用INTERSECTinstead of JOIN:

    CASE WHEN EXISTS ( SELECT * FROM (VALUES (1), (2), (3)) AS x(i) 
                     INTERSECT 
                       SELECT * FROM (VALUES (@var1), (@var2), (@var3)) AS y(i)
                     )
    THEN 1 ELSE 0 END 
    

    在dbfiddle.uk进行测试。

    • 10
  2. Henrico Bekker
    2017-06-17T08:24:41+08:002017-06-17T08:24:41+08:00

    您可以尝试以下而不是 CASE

    declare @var1 int, @var2 int, @var3 int
    
    set @var1 = 1
    set @var2 = 2
    Set @var3 = 3
    
    IF 1 IN (@var1, @var2, @var3) or 2 in (@var1, @var2, @var3) or 3 in (@var1, @var2, @var3)
    BEGIN
        Select 1;
    END
    
    else 
    BEGIN
        select 0;
    END
    
    • 4
  3. Robert Carnegie
    2017-06-18T06:26:22+08:002017-06-18T06:26:22+08:00

    如果不需要保留变量,则可以编写一个循环,例如,

    SET @found = 0
    WHILE @var1 IS NOT NULL AND @found = 0
    BEGIN
      IF @var1 IN (1, 2, 3) 
      BEGIN SET @found = 1  END
      ELSE
      BEGIN
        SET @var1 = @var2; SET @var2 = @var3; SET @var3 = NULL
      END
    END
    

    ......但这不是桌面。我们是 DBA,我们使用表。

    • 1
  4. Best Answer
    Anthony Genovese
    2017-06-22T11:16:04+08:002017-06-22T11:16:04+08:00

    给定三个设置输入和一个单独的值表,以下代码将起作用。

    declare @input1 int =1
    declare @input2 int =2
    declare @input3 int =3
    
    CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)
    INSERT INTO #tab1 
    VALUES (1,2,3),(0,0,0),(0,4,0),(1,4,1),(4,0,0),(0,5,1),(2,4,0),(1,4,3)
    
    
     declare @set table(input int)
     insert  @set values (@input1), (@input2),(@input3);
    
     select distinct #tab1.*, case when join1.i1 is null then 'No Match' else 'match' end matching
     from #tab1
     left join (select distinct a.input i1, b.input i2 ,c.input i3
                    from @set a 
                    cross join @set b 
                    cross join @set c ) join1
        on join1.i1=#tab1.var1
            or join1.i2=#tab1.var2
            or join1.i3=#tab1.var3
    

    如果您不想使用“in”,我想这就是您要找的东西。老实说,我会使用“in”。它更简单,更容易编写。上面的代码需要一些时间才能完成。但是,我会按如下方式更新您的“in”代码:

    select * ,'match'
    from #tab1
    where @input1 in (var1, var2, var3)
        or @input2 in (var1, var2, var3)
        or @input3 in (var1, var2, var3)
    union 
    select * ,'no-match'
    from #tab1
    where @input1 not in (var1, var2, var3)
        and @input2 not in (var1, var2, var3)
        and @input3 not in (var1, var2, var3)
    
    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve