mysql 如何使用SQL的“IN”来检查值是否等于括号中的所有列

wwtsj6pe  于 2023-06-28  发布在  Mysql
关注(0)|答案(4)|浏览(125)

我在phpmyadmin数据库中有一个SQL表,它有8列。我想检查其中的4个(特定的4列)是否等于某个值。例如,假设值为“abcd”,列名为:c1 c2 c5 c8
我试着做这个查询:
SELECT * FROM table_name t WHERE 'abcd' IN (t.c1, t.c2, t.c5, t.c8)
问题是,即使4列中有一列是“abcd”,我也会得到一个行结果,但我希望条件只有在所有4列都是“abcd”时才为真。
我也试着读了ANYALL,但我不认为它会工作。
当然,我可以将WHERE子句写成t.c1 = 'abcd' AND t.c2 = 'abcd'等等……但是我想要一个简短的方式(如果可能的话),而不是多次写入值“abcd”。
如何编写此查询?

cnwbcb6i

cnwbcb6i1#

如果只想关注四列(c1、c2、c5和c8)为“abcd”,并排除任何其他列,则需要使用IN运算符将元组(t.c1、t.c2、t.c5、t.c8)与元组('abcd'、'abcd'、'abcd'、'abcd')进行比较。如果列中的所有四个值都与元组中的相应值匹配,则将返回该行。

CREATE TABLE MyTable (
  id INT PRIMARY KEY AUTO_INCREMENT,
  c1 VARCHAR(50),
  c2 VARCHAR(50),
  c3 VARCHAR(50),
  c4 VARCHAR(50),
  c5 VARCHAR(50),
  c6 VARCHAR(50),
  c7 VARCHAR(50),
  c8 VARCHAR(50)
);

INSERT INTO MyTable (c1, c2, c3, c4, c5, c6, c7, c8)
VALUES
  ('abcd', 'efgh', 'ijkl', 'mnop', 'abcd', 'qrst', 'uvwx', 'abcd'),
  ('abcd', 'abcd', 'ijkl', 'efrg', 'abcd', 'efgh', 'efgh', 'abcd'),
  ('efgh', 'ijkl', 'mnop', 'qrst', 'uvwx', 'abcd', 'efgh', 'ijkl'),
  ('abcd', 'efgh', 'ijkl', 'mnop', 'qrst', 'uvwx', 'efgh', 'ijkl');
Records: 4  Duplicates: 0  Warnings: 0
SELECT *
FROM MyTable t
WHERE ('abcd', 'abcd', 'abcd', 'abcd') IN ((t.c1, t.c2, t.c5, t.c8));

| C1| C2| C3|碳四|C5| C6| C7| C8| c8 |
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----| ------------ |
| 阿拉伯基督教民主联盟|阿拉伯基督教民主联盟|艾克尔|欧洲铁路公司|阿拉伯基督教民主联盟|欧洲植物生长联合会|欧洲植物生长联合会|阿拉伯基督教民主联盟| abcd |
fiddle

mec1mxoz

mec1mxoz2#

下面是一个只需要写一次'abcd'的解决方案:

SELECT * FROM table_name t 
WHERE 'abcd' = t.c1
  AND t.c1 = t.c2
  AND t.c1 = t.c5
  AND t.c1 = t.c8;

另一个解决方案要求你写两次'abcd',不管列表中有多少列:

SELECT * FROM table_name t 
WHERE 'abcd' = LEAST(t.c1, t.c2, t.c5, t.c8)
  AND 'abcd' = GREATEST(t.c1, t.c2, t.c5, t.c8);

如果任何一个列都是NULL,那么它们就不可能都等于'abcd'。
这些解决方案并不像您要求的那样使用IN() predicate ,但它们非常简单明了。

zf2sa74q

zf2sa74q3#

听起来是个奇怪的要求。通常人们更关心的是性能和效率,而不是做某事的具体方法。
但是...

Select * 
FROM table_name 
where replace(concat(t.c1,t.c2,t.c5,t.c8),'abcd','') IN ('')

串联我们关心的领域;用空集替换每个,检查空集。我猜它会返回一个假阳性,如果所有这些字段都是“空集”最初虽然…
dbfIDDLE

6vl6ewon

6vl6ewon4#

不如

where concat(c1,c2,c5,c8) = 'abcdabcdabcdabcd'

您可能需要使用+||,具体取决于您的特定数据库。

  • 取决于 * 您的数据,您可能还需要分隔,例如
where concat(c1,'-',c2,'-',c5,'-',c8) = 'abcd-abcd-abcd-abcd'

相关问题