SQL如何从不在表中的列表中查找值

SQL如何从不在表中的列表中查找值,sql,sqlite,Sql,Sqlite,我有一个表,在一个名为“code”的字段中有值 ABC DFG CDF 如何从列表中选择表中未包含的所有代码? 例如: 列表不在表中 列表类似于“ABC”、“BBB”、“TTT”(作为字符串)尝试以下方法: SELECT code FROM Table1 WHERE code NOT IN ('ABC','CCC','DEF') --values from your list 这将导致: DFG CDF 如果列表位于另一个表中,请尝试以下操作: SELECT code FROM Tab

我有一个表,在一个名为“code”的字段中有值

ABC
DFG
CDF
如何从列表中选择表中未包含的所有代码? 例如:

列表不在表中

列表类似于“ABC”、“BBB”、“TTT”(作为字符串)

尝试以下方法:

SELECT code 
FROM Table1
WHERE code NOT IN ('ABC','CCC','DEF') --values from your list
这将导致:

DFG
CDF
如果列表位于另一个表中,请尝试以下操作:

SELECT code 
FROM Table1
WHERE code NOT IN (SELECT code FROM Table2)
SELECT list
FROM Table2
WHERE list NOT IN (SELECT code from table1)
根据您的要求,尝试以下方法:

SELECT code 
FROM Table1
WHERE code NOT IN (SELECT code FROM Table2)
SELECT list
FROM Table2
WHERE list NOT IN (SELECT code from table1)
它将选择不在代码中的列表值。 请参见

中的示例尝试以下操作:

SELECT code 
FROM Table1
WHERE code NOT IN ('ABC','CCC','DEF') --values from your list
这将导致:

DFG
CDF
如果列表位于另一个表中,请尝试以下操作:

SELECT code 
FROM Table1
WHERE code NOT IN (SELECT code FROM Table2)
SELECT list
FROM Table2
WHERE list NOT IN (SELECT code from table1)
根据您的要求,尝试以下方法:

SELECT code 
FROM Table1
WHERE code NOT IN (SELECT code FROM Table2)
SELECT list
FROM Table2
WHERE list NOT IN (SELECT code from table1)
它将选择不在代码中的列表值。
请参见

中的示例。是否可以使用通用表表达式

WITH temp(code) AS (VALUES('ABC'),('BBB'),('TTT'),(ETC...))
SELECT temp.code FROM temp WHERE temp.code NOT IN 
(SELECT DISTINCT table1.code FROM table1); 

这将允许您在VALUES语句中创建一个用字符串列表定义的临时表。然后使用标准SQL选择不在table1.code列中的值。

是否可以使用通用表表达式

WITH temp(code) AS (VALUES('ABC'),('BBB'),('TTT'),(ETC...))
SELECT temp.code FROM temp WHERE temp.code NOT IN 
(SELECT DISTINCT table1.code FROM table1); 

这将允许您在VALUES语句中创建一个用字符串列表定义的临时表。然后使用标准SQL选择table1.code列之外的值。

这个解决方案好吗,还是我遗漏了什么

create table table10 (code varchar(20));

insert into table10 (code) values ('ABC');
insert into table10 (code) values ('DFG');
insert into table10 (code) values ('CDF');

select * from (
  select 'ABC' as x
  union all select 'BBB'
  union all select 'TTT'
) t where t.x not in (select code from table10);
-- returns: BBB
--          TTT

看。

这个解决方案好吗,还是我遗漏了什么

create table table10 (code varchar(20));

insert into table10 (code) values ('ABC');
insert into table10 (code) values ('DFG');
insert into table10 (code) values ('CDF');

select * from (
  select 'ABC' as x
  union all select 'BBB'
  union all select 'TTT'
) t where t.x not in (select code from table10);
-- returns: BBB
--          TTT

请参阅。

问题关键点需要将
“ABC”、“BBB”、“TTT”
源数据trun设置为一个表

那张桌子看起来像

|---+
|val|
|---+
|ABC|
|BBB|
|TTT|
Sqlite不支持
Sqlite
函数。因此,要将您的列表变成一个表,这将有点困难

您可以使用
CTE Recursive
生成like
sqlite
函数

  • 您需要使用
    replace
    功能从您的列表中删除
    双引号 源数据
  • CTE中有两列
    • val
      列携带您的列表数据
    • rest
      列以记住当前
      splite
      字符串
  • 您将从
    CTE
    中获得如下表格

    |---+
    |val|
    |---+
    |ABC|
    |BBB|
    |TTT|
    
    然后您可以将数据与
    表1
    进行比较


    不在

    WITH RECURSIVE split(val, rest) AS (
        SELECT '',  replace('"ABC","BBB","TTT"','"','') || ',' 
        UNION ALL
        SELECT  
             substr(rest, 0, instr(rest, ',')),
             substr(rest, instr(rest, ',')+1)
        FROM split
        WHERE rest <> '')
    SELECT * from (
      SELECT val
      FROM split 
      WHERE val <> ''
    ) t where t.val not IN (
      select t1.code 
      from table1 t1
    )
    

    如果要在一行中显示,请使用
    GROUP\u CONCAT
    函数

    WITH RECURSIVE split(val, rest) AS (
        SELECT '',  replace('"ABC","BBB","TTT"','"','') || ',' 
        UNION ALL
        SELECT  
             substr(rest, 0, instr(rest, ',')),
             substr(rest, instr(rest, ',')+1)
        FROM split
        WHERE rest <> '')
    SELECT GROUP_CONCAT(val,',') val from (
      SELECT val
      FROM split 
      WHERE val <> ''
    ) t where t.val not IN (
      select t1.code 
      from table1 t1
    )
    
    sqlfiddle:


    注意:
    SELECT*from[my list],其中table1.code不在[my list]
    中,这是不合理的,因为此查询无法找到
    table1
    ,因此无法获取
    table1.code

    您可以使用
    不存在
    加入
    来实现您的期望


    sqlfiddle:

    问题关键点需要将
    “ABC”、“BBB”、“TTT”
    源数据trun设置到表中

    那张桌子看起来像

    |---+
    |val|
    |---+
    |ABC|
    |BBB|
    |TTT|
    
    Sqlite不支持
    Sqlite
    函数。因此,要将您的列表变成一个表将有点困难

    您可以使用
    CTE Recursive
    生成like
    sqlite
    函数

  • 您需要使用
    replace
    功能从您的列表中删除
    双引号 源数据
  • CTE中有两列
    • val
      列携带您的列表数据
    • rest
      列以记住当前
      splite
      字符串
  • 您将从
    CTE
    中获得如下表格

    |---+
    |val|
    |---+
    |ABC|
    |BBB|
    |TTT|
    
    然后您可以将数据与
    表1
    进行比较


    不在

    WITH RECURSIVE split(val, rest) AS (
        SELECT '',  replace('"ABC","BBB","TTT"','"','') || ',' 
        UNION ALL
        SELECT  
             substr(rest, 0, instr(rest, ',')),
             substr(rest, instr(rest, ',')+1)
        FROM split
        WHERE rest <> '')
    SELECT * from (
      SELECT val
      FROM split 
      WHERE val <> ''
    ) t where t.val not IN (
      select t1.code 
      from table1 t1
    )
    

    如果要在一行中显示,请使用
    GROUP\u CONCAT
    函数

    WITH RECURSIVE split(val, rest) AS (
        SELECT '',  replace('"ABC","BBB","TTT"','"','') || ',' 
        UNION ALL
        SELECT  
             substr(rest, 0, instr(rest, ',')),
             substr(rest, instr(rest, ',')+1)
        FROM split
        WHERE rest <> '')
    SELECT GROUP_CONCAT(val,',') val from (
      SELECT val
      FROM split 
      WHERE val <> ''
    ) t where t.val not IN (
      select t1.code 
      from table1 t1
    )
    
    sqlfiddle:


    注意:
    SELECT*from[my list],其中table1.code不在[my list]
    中,这是不合理的,因为此查询无法找到
    table1
    ,因此无法获取
    table1.code

    您可以使用
    不存在
    加入
    来实现您的期望


    SQLFIDLE:

    这也可以使用存储过程实现:

    DELIMITER //
    drop function if exists testcsv
    //
    create function testcsv(csv varchar(255)) returns varchar(255)
    deterministic
    begin
        declare pos, found int default 0;
        declare this, notin varchar(255);
        declare continue handler for not found set found = 0;
    
        set notin = '';
        repeat
            set pos = instr(csv, ',');
            if (pos = 0) then
                set this = trim('"' from csv);
                set csv = '';
            else
                set this = trim('"' from trim(substring(csv, 1, pos-1)));
                set csv = substring(csv, pos+1);
            end if;
            select 1 into found from table1 where code = this;
            if (not found) then
                if (notin = '') then
                    set notin = this;
                else
                    set notin = concat(notin, ',', this);
                end if;
            end if;
            until csv = ''
        end repeat;
        return (notin);
    end
    //
    select testcsv('"ABC","BBB","TTT","DFG"')
    
    输出:

    BBB, TTT
    

    这也可以通过使用存储过程来实现:

    DELIMITER //
    drop function if exists testcsv
    //
    create function testcsv(csv varchar(255)) returns varchar(255)
    deterministic
    begin
        declare pos, found int default 0;
        declare this, notin varchar(255);
        declare continue handler for not found set found = 0;
    
        set notin = '';
        repeat
            set pos = instr(csv, ',');
            if (pos = 0) then
                set this = trim('"' from csv);
                set csv = '';
            else
                set this = trim('"' from trim(substring(csv, 1, pos-1)));
                set csv = substring(csv, pos+1);
            end if;
            select 1 into found from table1 where code = this;
            if (not found) then
                if (notin = '') then
                    set notin = this;
                else
                    set notin = concat(notin, ',', this);
                end if;
            end if;
            until csv = ''
        end repeat;
        return (notin);
    end
    //
    select testcsv('"ABC","BBB","TTT","DFG"')
    
    输出:

    BBB, TTT
    


    您使用的是哪种数据库管理系统?博士后?Oracle?@VijaykumarHadalgi列表不在表中。@a_horse_和_no_name我正在使用SQLite(android应用程序)您正在使用哪个DBMS?博士后?Oracle?@VijaykumarHadalgi列表不在表中。@a_horse_与_no_name我正在使用SQLite(android应用程序)谢谢,但我希望列表中的值不在表中,而不是相反。我非常感谢您为帮助我所做的努力。但是列表不在表中(正如我在文章中提到的),它们是我可以在sql中使用的“字符串”。您如何将该字符串传递给sql?我将手动将其放入查询中。因此,不管它需要什么。让我们感谢,但我希望列表中的值不在表中,而不是相反。我非常感谢您为帮助我所做的努力。但是列表不在表中(正如我在文章中提到的),它们是我可以在sql中使用的“字符串”。您如何将该字符串传递给sql?我将手动将其放入查询中。不管它需要什么,让我们从一个表中选择一个不在列表中的值。OP希望从列表中选择不在表中的值。我的错误。我修复了它。这是从列表之外的表中选择值。OP希望从列表中选择不在表中的值。我的错误。我修正了。CTE部分的语法有点不正确。这里有正确的语法:@plasmaTonic谢谢-我已经更新了值语法。CTE部分的语法有点不正确。这里有正确的语法:@plasmaTonic谢谢-我已经更新了值语法。