MySQL - 如何检查所有列中的值

don*_*640 13 mysql

我很好奇,有没有一种好方法可以搜索给定值的所有列?就我而言,它根本不需要很快,它只是一种一次性的东西,而且我真的不想输入每个字段名称。这正是我现在要做的,但我认为肯定有更好的方法。

我想转这个:

SELECT * FROM table WHERE col1 = 'val' OR col2 = 'val' OR col3 = 'val';
Run Code Online (Sandbox Code Playgroud)

进入这个:

SELECT * FROM table WHERE * = 'val'
Run Code Online (Sandbox Code Playgroud)

......或者,甚至更好(虽然我严重怀疑......)

SELECT * FROM table WHERE * like '%val%'
Run Code Online (Sandbox Code Playgroud)

我发现了this,这似乎有点不太接近,但我没有找到更接近的东西:

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)
Run Code Online (Sandbox Code Playgroud)

不同之处在于,它会为指定值搜索一系列列,而我正在尝试在所有列中搜索单个值。

不过这并不重要,就像我说的比什么都重要我只是好奇

Bil*_*win 25

SQL 没有提供这样做的好方法,因为有 N 个可能在同一域中具有值的列可能不是一个好的表设计。这可能是“重复组”的情况,例如您有列phone1, phone2, phone3, ... phoneN

如果您有多个具有相同逻辑值域的列,则可能是多值属性的情况(如电话示例)。存储多值属性的标准方法是作为另一个表中的多行,并引用它们在主表中所属的行。

如果这样做,那么您只需在相关表的一列中搜索特定值。

SELECT t.* FROM mytable AS t
JOIN phones AS p ON t.primaryKey = p.refKey 
WHERE p.phone = ?
Run Code Online (Sandbox Code Playgroud)

  • 不,只需更改表格布局。就是这样。我厌倦了“我无法改变它”的借口。我不再接受了。现在是学习如何改变事物的时候了。 (11认同)

ype*_*eᵀᴹ 18

你可以得到的越接近,使用IN

SELECT * FROM table WHERE 'val' IN (col1, col2, ..., colN) ;
Run Code Online (Sandbox Code Playgroud)

您仍然必须编写要检查的所有列。
而且它与OR您的表达方式没有任何不同,无论是表现还是其他方面。这只是一种不同的、等效的编写表达式的方式,字符更少。


don*_*640 9

感觉自从我问这个问题以来已经有一年了,但我只是偶然发现了我正在寻找的东西!这不是一个 SQL 语句,就像我预期的那样,但它满足了我的要求。

在 MySQL Workbench 中,您可以右键单击表或架构,然后选择“搜索表数据”。架构上下文菜单

  • +1。这非常有用。它允许在数据库导航器中任意选择的模式/表的文本和非文本(可以转换为文本,例如日期)列中进行搜索。 (2认同)

Len*_*art 6

您需要分两步完成,首先生成类似的sql(假设您的表在模式S中名为T:

select concat(' SELECT * FROM t WHERE ''a'' in ('
             , GROUP_CONCAT(COLUMN_NAME)
             , ')')
from INFORMATION_SCHEMA.columns 
where table_schema = 's' 
  and table_name = 't'
  and DATA_TYPE IN ('char','varchar');
Run Code Online (Sandbox Code Playgroud)

现在您可以执行该字符串。请注意,您必须用额外的 ' 引用 'a'。例如,如果将其放入过程中,则可以准备并执行生成的字符串。

我测试过:

create table t (a char(3), b varchar(5), c int);
insert into t(a,b) values ('a','b'),('b','c'),('c','c');    
Run Code Online (Sandbox Code Playgroud)

生成的查询在哪里:

SELECT * FROM t WHERE 'a' in (a,b)
Run Code Online (Sandbox Code Playgroud)

并执行该结果:

a   b   c
---------
a   b   
Run Code Online (Sandbox Code Playgroud)