获取数据表中特定列的列名

3

我正在做一个项目,但遇到了一个问题。我想要从一个表中获取特定列的名称,该列的值为“no”。

我有一个名为 subscription 的表,它有四个字段:id(integer),email(varchar),sms(varchar)和 phone(varchar),我的 email、sms 和 phone 字段只有 'yes' 或 'no' 两种取值。

现在我想要检索只有那些具有值为'no'的列的名称。我想在 mysql 中执行此查询。

我尝试了以下查询,但它会返回包含 'no' 的任何一行的完整结果:

SELECT * FROM test.subscription WHERE 'no' IN (email,sms,phone);

就像我现在有这两行数据,我想选择value='no'且id=1的列名

就像我现在有这两行数据,我想选择value='no'且id=1的列名。


3
您可能需要查询系统表以获取表的元数据,如列名。这篇文章可以帮助您进行查询:https://dev59.com/LG445IYBdhLWcg3wdqEL - Neil Hibbert
不太明白你的意思,请详细说明。 - rupinder18
我们想选择值为“no”的列名,而不是以某个特定字符开头的列名。 - rupinder18
但是你不能在客户端完成这个操作吗?您提供的查询可以作为基础,然后您可以使用值“no”过滤列。 - Erik Schierboom
如果您有一行具有以下值的数据:id:1; email:Yes; sms:No; phone:Yes,您想要返回一个包含字符串或字符串数组的内容,其中包含 "sms" 吗? - Hjalmar Z
我不明白你在说什么。 - rupinder18
3个回答

2
如何使用类似于case语句的简单且经济实惠的方法呢?示例如下:
SELECT ID, 'ColName' = CASE
    WHEN email = 'no' THEN 'email'
    END, 
    'ColName2' = CASE
    WHEN sms = 'no' THEN 'sms'
    END, 
    'ColName3' = CASE
    WHEN phone = 'no' THEN 'phone'
    END
FROM subscription
where ID = 2

0

由于权限不足,我无法将此内容作为评论发布。但是,如果您想要搜索一个表中保存的值(可以是任何列),您可以查看这个SO post

使用同一篇帖子中的代码 -

DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))

DECLARE @SearchStr nvarchar(100)

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = 'no'
SET @SearchStr2 = QUOTENAME('%' + 'no' + '%','''')

    SET @ColumnName = ''
    SET @TableName = '[test].[dbo].[subscription]'

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )

        IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO @Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END 


SELECT ColumnName, ColumnValue FROM @Results

我尝试了这段代码,但是它给出了以下错误:您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式。在第1行附近,应该是“DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))”。 - rupinder18
我已经编辑过了,以在上面的代码中搜索字符串“no”。我已经测试过它,运行得很好。你能确保你在一个新的查询窗口中单独运行它,并且没有任何可能导致它在这一行出错的东西吗? - siddharth
我尝试再次执行,但仍然得到相同的错误... 你在mysql查询浏览器中执行过这个查询吗? - rupinder18
我正在使用SQL Server而你正在使用MYSQL。所以问题可能在于语法。我认为你应该使用“CREATE TEMPORARY TABLE Results”。但是我不确定其余部分是否也适用于MYSQL。 - siddharth
执行上述代码后得到的结果在SQL Server中是正确的。 - rupinder18
显示剩余3条评论

0
如果我理解问题正确,我认为以下的查询可能有效。
SELECT * 
FROM test.subscription 
WHERE 1=1
and 
(email = 'no'
or
email = 'no'
or 
sms = 'no'
)
and id=(your values)

这个查询结果和我的查询一样,但我不想要这个,请再读一遍并帮助我。 - rupinder18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接