Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL Get列位于非零的单行中_Mysql_Sql_Sqlite - Fatal编程技术网

Mysql SQL Get列位于非零的单行中

Mysql SQL Get列位于非零的单行中,mysql,sql,sqlite,Mysql,Sql,Sqlite,假设我有一张这样的桌子: SELECT 'Col1' AS Column FROM Table WHERE Col1 = 1 UNION ALL SELECT 'Col2' AS Column FROM Table WHERE Col2 = 1 etc. 表名:测试 col1 | col2 | col3 | col4 -------------------------- a | 0 | 0 | 1 是否可以检索行,而只检索非零的列,而不必单独列出每一列 有没有一种简单的方法

假设我有一张这样的桌子:

SELECT 'Col1' AS Column
FROM Table
WHERE Col1 = 1
UNION ALL
SELECT 'Col2' AS Column
FROM Table
WHERE Col2 = 1
etc.
表名:测试

col1 | col2 | col3 | col4
--------------------------
a    | 0    | 0    | 1
是否可以检索行,而只检索非零的列,而不必单独列出每一列

有没有一种简单的方法可以选择值为1的行?只有一列的每一行的整数值为1


我正在尝试获取这一行的列名,它不是零。此表中的列将增长,因此我不想在sql语句中列出每个列名。我正在使用SQLite。

像这样的东西能实现你想要的吗

create table Test
(
    col1 nvarchar(100),
    col2 int,
    col3 int,
    col4 int
)
insert into Test  values('a', 1, 0, 0)
insert into Test values('b', 0, 2, 0)
insert into Test values('c', 0, 0, 3)

select col1, val = case
    when col2 > 0 then col2
    when col3 > 0 then col3
    when col4 > 0 then col4
    end
from test

关系数据库旨在在行而不是列中执行操作。。因此,列操作非常低效。也许你对你的问题使用了错误的方法。想想看:假设你找到了解决问题的方法,如果不止一个“1”出现,会发生什么?如果没有“1”出现怎么办

然后,我假设您还需要具有“1”值的列名,那么您将它存储在结果中的什么位置呢


我强烈建议您将该信息存储在另一个表中,这样您就可以快速实现所需的功能。

一种方法是循环遍历每一列,并确定每一行该列中的值是否为一。以下是一个可以为您的环境修改的示例:

为了使它能够与SQLite一起工作,您还需要对其进行调整。下面是我从一个做过这件事的人那里找到的一句话:

最后,我通过几个循环完成了这项工作,首先,从sqlite_主表中提取表名数组,然后通过另一个循环遍历每个列名,然后从dbCursor.description中提取。

这将是一个混乱的过程,但它可能满足您的需要。如果你不想变得太复杂,你可以这样做:

SELECT 'Col1' AS Column
FROM Table
WHERE Col1 = 1
UNION ALL
SELECT 'Col2' AS Column
FROM Table
WHERE Col2 = 1
etc.

这需要大量的手工工作,需要在您更改列时进行更新,但对您来说可能更简单。

不一定高效,但您可以对架构中的每个字段进行查询。是的,我知道您的意思,但我将向此表中添加更多列,因此我试图避免这种情况。哪个SQL。。。您有MySQL和SQLite,更不用说SQL(SQL server、Oracle和许多其他)对不起,它在SQLite中,我将编辑并添加它。实际上,我正在寻找更像这样的东西:选择(col2、col3、col4),其中col1=value和col2!=0和col3!=0和col4!=0; 但我想这样做,而不必写下每一列的名称。我只想得到col2,col3中不为零的一列,col4@kappa是的,但是如果需要,您可以动态创建该sql。@bryansammon那么您就不走运了,因为如果sqlite支持oracle的“立即执行”之类的东西,那么这是不可能的(无论如何,如果不动态创建sql的话)您可以迭代信息模式并进行检查。。。许多查询可以获得如此简单的数据。我再次建议将这些信息按行存储在另一个表中。我同意@kappa,这似乎是一件非常奇怪的事情。也许你需要一个有两列的表-名称和值或其他什么,只需选择那些值>0的表。是的,我明白你的意思,这是一个很好的想法,可能可以完成这项工作。。但是你确定这是一件值得做的事情吗?@kappa-嗯,这很难看,不会赢得任何速度奖,但这真的取决于需要它的人。一切都取决于环境。我不打算用这个计划来设计数据库,但是如果我必须使用现有的系统,我需要这份报告,我一定会考虑它。