假设我们有表登录:
id| name | lastname
---------------------
1 | mark | johnson
2 | jack | sparrow
3 | bruno | mark
我们都知道,我们可以查询类似于:SELECT name FROM login WHERE id = 1;
的SQL,并得到返回mark
。
我正在寻找类似的查询:
SELECT column_name FROM logins WHERE value = 'mark';
这将导致CCD_ 3甚至
SELECT column_name FROM logins WHERE value = 'mark' AND id = 1;
这将导致CCD_ 4。
编辑:这个问题比简单的答案更复杂。真正的问题是,当我们知道期望值时,如何从100多列中选择列名。例如,我们知道表中的某个地方有值17,58
,但我们想查找列名。
直接获取列名是不可能的,但是使用case语句可以构造查询以返回匹配值的列名,例如
select
id,
case
when name = 'mark' then 'name'
when lastname = 'mark' then 'lastname'
else 'Nothing'
end as column_name
from logins
DEMO
在PostgreSQL中,您可以为此使用hstore扩展(我认为MySQL中没有任何类似的扩展):
with login_data as (
select id,
skeys(hstore(l)) as column_name,
svals(hstore(l)) as column_value
from logins as l
where avals(hstore(l)) @> array['mark']
)
select id, column_name
from login_data
where column_value = 'mark'
;
SQLFiddle示例:http://sqlfiddle.com/#!15/115d5/1
但演出很可能会非常糟糕。
如果您想在(name)或(lastname)中获取mark-if-name我想这会帮助你
SELECT column_name FROM logins WHERE ( name = 'mark' Or lastname = 'mark') AND id = 1;
如果你不知道用户的id,就会出现这样的情况:
SELECT DISTINCT name FROM logins WHERE name = 'mark';