反向SQL:SELECT column_name WHERE值

时间:2014-10-28 08:24:34

标签: mysql sql postgresql

我们假设我们有表登录:

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';

将导致name, lastname甚至

SELECT column_name FROM logins WHERE value = 'mark' AND id = 1;

将导致name

编辑:问题比简单的答案更复杂。真正的问题是当我们知道预期值时,如何从100多列中选择列名。例如,我们知道表格中的某个地方有值17,58,但我们想找到列名。

4 个答案:

答案 0 :(得分:1)

无法直接获取列名称,但是使用case语句可以构造查询以返回匹配值的列名称

select
id,
case 
 when name = 'mark' then 'name' 
 when lastname = 'mark' then 'lastname'
 else 'Nothing'
end as column_name 
from logins

<强> DEMO

答案 1 :(得分:0)

在PostgreSQL中你可以使用hstore extension(我不认为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

但表演很可能会非常糟糕。

答案 2 :(得分:-1)

如果你想在(姓名)或(姓氏)中输入标记 我认为这会对你有帮助

SELECT column_name FROM logins WHERE ( name  = 'mark' Or lastname = 'mark') AND id = 1;

答案 3 :(得分:-1)

如果您不知道用户的身份,请执行以下操作:

SELECT DISTINCT name FROM logins WHERE name = 'mark';