SQL如何从不在表中的列表中查找值
我有一个表,在一个名为“code”的字段中有值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
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
生成likesqlite
函数
replace
功能从您的列表中删除“
双引号
源数据
列携带您的列表数据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
生成likesqlite
函数
replace
功能从您的列表中删除“
双引号
源数据
列携带您的列表数据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谢谢-我已经更新了值语法。