我很好奇,有没有一种好方法可以搜索给定值的所有列?就我而言,它根本不需要很快,它只是一种一次性的东西,而且我真的不想输入每个字段名称。这正是我现在要做的,但我认为肯定有更好的方法。
我想转这个:
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)
ype*_*eᵀᴹ 18
你可以得到的越接近,使用IN
:
SELECT * FROM table WHERE 'val' IN (col1, col2, ..., colN) ;
Run Code Online (Sandbox Code Playgroud)
您仍然必须编写要检查的所有列。
而且它与OR
您的表达方式没有任何不同,无论是表现还是其他方面。这只是一种不同的、等效的编写表达式的方式,字符更少。
您需要分两步完成,首先生成类似的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)
归档时间: |
|
查看次数: |
40106 次 |
最近记录: |