GVKun编程网logo

SQL:返回列名,其中列包含给定值(sql 返回列名)

8

以上就是给各位分享SQL:返回列名,其中列包含给定值,其中也会对sql返回列名进行解释,同时本文还将给你拓展Linq查询返回列表项,其中包含另一个列表、MSSQL获取数据库名,表名,列名,说明等信息(

以上就是给各位分享SQL:返回列名,其中列包含给定值,其中也会对sql 返回列名进行解释,同时本文还将给你拓展Linq查询返回列表项,其中包含另一个列表、MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)、MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字、MySQL:返回更新的行等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

SQL:返回列名,其中列包含给定值(sql 返回列名)

SQL:返回列名,其中列包含给定值(sql 返回列名)

我想知道是否可以在SQL Server中运行一个命令/存储的程序,该程序将为我提供包含表中给定数据的列的名称。

因此,如果我要查询,请给我该表中所有包含值75的列。我不希望该行。只是表中的列名…这可能吗?

Linq查询返回列表项,其中包含另一个列表

Linq查询返回列表项,其中包含另一个列表

您可以获得使任何运费返回错误的公司:

        var errorCompanyIds = response.Items
            .SelectMany(x => x.Freights)
            .Where(y => y.Errors !=null && y.Errors.Any())
            .Select(y => y.Company.Id)
            .ToList();

然后,您可以创建新列表并过滤该公司的所有货运

        var newList = new FreightSimulation
        {
            Items = response.Items.Select(x => new Item
            {
                Id = x.Id,Freights = x.Freights.Where(y => !errorCompanyIds.Contains(y.Company.Id)).ToList()
            }).ToList()

        };
,

这应该有效:

var companyIds = new[] { 1,7468 };
var result = response.Items.SelectMany(i => i.Freights.Select(f => new { itemId = i.Id,Freight = f }))
            .Where(i => companyIds.Contains(i.itemId) && (!(i.Freight.Errors?.Any() ?? false)));

您在这里要做的是创建对以保留ID,然后根据所需条件过滤这些对。

或者,您可以先过滤原始货运清单,然后按公司选择:

var companyIds = new[] { 1,7468 };
var result = response.Items.SelectMany(i => i.Freights.Where(f => (!(f.Errors?.Any() ?? false)))
             .Select(f => new { itemId = i.Id,Freight = f }))
             .Where(i => companyIds.Contains(i.itemId));

以防万一这部分令人困惑:

(!(i.Freight.Errors?.Any() ?? false))

这实际上翻译为:

i.Freight.Errors == null || !i.Freight.Errors.Any()

具有null错误或没有错误(空收款)的平均运费。

MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)

MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)

/**************************************************************************************************************
、获取所有用户名:
islogin=''1''   :表示帐户
islogin=''0''   :表示角色
status=''2''   :表示用户帐户
status=''0''   :表示系统帐户
**************************************************************************************************************/SELECT nameFROM   sysusersWHERE  status = ''0''
       AND islogin = ''1''/**************************************************************************************************************
、获取所有数据库名:
**************************************************************************************************************/SELECT nameFROM     master..sysdatabasesORDER BY name/**************************************************************************************************************
、获取所有表名:
XType=''U''    :表示所有用户表;
XType=''S''    :表示所有系统表;
**************************************************************************************************************/SELECT nameFROM     数据库名..sysobjectsWHERE    xtype = ''U''ORDER BY name/**************************************************************************************************************
、获取所有字段名:
**************************************************************************************************************/SELECT nameFROM   syscolumnsWHERE  id = Object_id(''表名'')/**************************************************************************************************************
、获取数据库所有类型:
**************************************************************************************************************/SELECT nameFROM   systypes/**************************************************************************************************************
、获取主键字段:
**************************************************************************************************************/SELECT nameFROM   syscolumnsWHERE  id = Object_id(''表名'')       AND colid = (SELECT TOP 1 keyno                    FROM   sysindexkeys                    WHERE  id = Object_id(''表名''))/**************************************************************************************************************
、获取表字段的基本信息:
a.
**************************************************************************************************************/SELECT 字段名 = Rtrim(b.name)
       ,主键 = CASE 
               WHEN h.id IS NOT NULL THEN ''PK''
               ELSE ''''
             END
       ,字段类型 = Type_name(b.xusertype)                + CASE 
                    WHEN b.colstat & 1 = 1 THEN ''[ID(''
                                                 + CONVERT(VARCHAR,Ident_seed(a.name))                                                 + '',''
                                                 + CONVERT(VARCHAR,Ident_incr(a.name))                                                 + '')]''
                    ELSE ''''
                  END
       ,长度 = b.length
       ,允许空 = CASE b.isnullable 
                WHEN 0 THEN ''N''
                ELSE ''Y''
              END
       ,默认值 = Isnull(e.TEXT,'''')
       ,字段说明 = Isnull(c.VALUE,'''')FROM     sysobjects a         INNER JOIN  sys.all_objects aa           ON a.id=aa.object_id 
              AND  schema_name(schema_id)=''dbo''
         ,syscolumns b         LEFT OUTER JOIN sys.extended_properties c           ON b.id = c.major_id              AND b.colid = c.minor_id         LEFT OUTER JOIN syscomments e           ON b.cdefault = e.id         LEFT OUTER JOIN (SELECT g.id
                                 ,g.colid                          FROM   sysindexes f
                                 ,sysindexkeys g                          WHERE  (f.id = g.id)                                 AND (f.indid = g.indid)                                 AND (f.indid > 0)                                 AND (f.indid < 255)                                 AND (f.status & 2048) <> 0) h           ON (b.id = h.id)              AND (b.colid = h.colid)WHERE    (a.id = b.id)         AND (a.id = Object_id(''表名''))  --要查询的表改成你要查询表的名称ORDER BY b.colid/**************************************************************************************************************
b.
**************************************************************************************************************/SELECT 表名 = CASE 
              WHEN a.colorder = 1 THEN d.name              ELSE ''''
            END
       ,表说明 = CASE 
                WHEN a.colorder = 1 THEN Isnull(f.VALUE,'''')                ELSE ''''
              END
       ,字段序号 = a.colorder
       ,字段名 = a.name
       ,标识 = CASE 
               WHEN Columnproperty(a.id,a.name,''IsIdentity'') = 1 THEN ''√''
               ELSE ''''
             END
       ,主键 = CASE 
               WHEN EXISTS (SELECT 1
                            FROM   sysobjects                            WHERE  xtype = ''PK''
                                   AND name IN (SELECT name                                                FROM   sysindexes                                                WHERE  indid IN (SELECT indid                                                                 FROM   sysindexkeys                                                                 WHERE  id = a.id                                                                        AND colid = a.colid))) THEN ''√''
               ELSE ''''
             END
       ,类型 = b.name
       ,字段长度 = a.length
       ,占用字节数 = Columnproperty(a.id,a.name,''PRECISION'')
       ,小数位数 = Isnull(Columnproperty(a.id,a.name,''Scale''),0)
       ,允许空 = CASE 
                WHEN a.isnullable = 1 THEN ''√''
                ELSE ''''
              END
       ,默认值 = Isnull(e.TEXT,'''')
       ,字段说明 = Isnull(g.[value],'''')FROM     syscolumns a         LEFT JOIN systypes b           ON a.xusertype = b.xusertype         INNER JOIN sysobjects d           ON (a.id = d.id)              AND (d.xtype = ''U'')              AND (d.name <> ''dtproperties'') 
          INNER JOIN  sys.all_objects c            ON d.id=c.object_id 
                AND  schema_name(schema_id)=''dbo''
         LEFT JOIN syscomments e           ON a.cdefault = e.id         LEFT JOIN sys.extended_properties g           ON (a.id = g.major_id)              AND (a.colid = g.minor_id)         LEFT JOIN sys.extended_properties f           ON (d.id = f.major_id)              AND (f.minor_id = 0)--where d.name=''要查询的表''         --如果只查询指定表,加上此条件ORDER BY a.id
         ,a.colorder/***************************************************************************************************************
c. 前两种不完整~
****************************************************************************************************************/--获取数据库中所有数据表EXEC sp_tables 
--  获取数据表或列结构及描述信息EXEC sp_columns ''表名''--2008新功能,获取数据表字段及描述信息SELECT *FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME=''表名''--  获取数据表字段的说明信息SELECT * FROM  ::fn_listextendedproperty(NULL, ''user'', ''dbo'', ''table'', ''表名'', ''column'', default) 
--    取得主索引EXEC sp_pkeys 表名 
 


/**************************************************************************************************************
表及字段描述信息处理示例
**************************************************************************************************************/--创建表CREATE TABLE 表 (
  a1  VARCHAR(10)
  ,a2 CHAR(2))--为表添加描述信息EXECUTE Sp_addextendedproperty N''MS_Description'' , ''人员信息表'' , N''user'' , N''dbo'' , N''table'' , N''表'' , NULL , NULLEXEC sys.sp_addextendedproperty 
@name=N''MS_Description'', @value=N''人员信息表'' , 
@level0type=N''SCHEMA'',@level0name=N''dbo'', 
@level1type=N''TABLE'',@level1name=N''表''
 --为字段a1添加描述信息EXECUTE Sp_addextendedproperty N''MS_Description'' , ''姓名'' , N''user'' , N''dbo'' , N''table'' , N''表'' , N''column'' , N''a1''EXEC sys.sp_addextendedproperty 
@name=N''MS_Description'', @value=N''人员信息表'' , 
@level0type=N''SCHEMA'',@level0name=N''dbo'', 
@level1type=N''TABLE'',@level1name=N''表'', 
@level2type=N''COLUMN'',@level2name=N''a1''

 --为字段a2添加描述信息EXECUTE Sp_addextendedproperty N''MS_Description'' , ''性别'' , N''user'' , N''dbo'' , N''table'' , N''表'' , N''column'' , N''a2''--更新表中列a1的描述属性:EXEC Sp_updateextendedproperty ''MS_Description'' , ''字段1'' , ''user'' , dbo , ''table'' , ''表'' , ''column'' , a1--显示表的描述属性SELECT *FROM   ::fn_listextendedproperty(NULL,''user'',''dbo'',''table'',''表名'',NULL,NULL)--显示表列的描述属性SELECT *FROM   ::fn_listextendedproperty(NULL,''user'',''dbo'',''table'',''表'',''column'',NULL)--删除表中列a1的描述属性:EXEC Sp_dropextendedproperty ''MS_Description'' , ''user'' , dbo , ''table'' , ''表'' , ''column'' , a1--删除测试DROP TABLE 表 

--批量删除用户表--1.删除外键约束DECLARE c1 cursor for 
    select ''alter table [''+ object_name(parent_obj) + ''] drop constraint [''+name+'']; ''
    from sysobjects 
    where xtype = ''F''open c1declare @c1 varchar(8000)fetch next from c1 into @c1while(@@fetch_status=0)    begin 
        exec(@c1)        fetch next from c1 into @c1
    endclose c1deallocate c1 
--2.删除表DECLARE c2 cursor for 
    select ''drop table [''+name +'']; ''
    from sysobjects 
    where xtype = ''u'' open c2declare @c2 varchar(8000)fetch next from c2 into @c2while(@@fetch_status=0)    begin
        exec(@c2)        fetch next from c2 into @c2
    endclose c2deallocate c2 
 
--批量清除表内容:--1.禁用外键约束DECLARE c1 cursor for 
    select ''alter table [''+ object_name(parent_obj) + ''] nocheck constraint [''+name+'']; ''
    from sysobjects 
    where xtype = ''F''open c1declare @c1 varchar(8000)fetch next from c1 into @c1while(@@fetch_status=0)    begin 
        exec(@c1)        fetch next from c1 into @c1
    endclose c1deallocate c1 
--2.清除表内容DECLARE c2 cursor for 
    select ''truncate table [''+name +'']; ''
    from sysobjects 
    where xtype = ''u'' open c2declare @c2 varchar(8000)fetch next from c2 into @c2while(@@fetch_status=0)    begin
        exec(@c2)        fetch next from c2 into @c2
    endclose c2deallocate c2--3.启用外键约束DECLARE c1 cursor for 
    select ''alter table [''+ object_name(parent_obj) + ''] check constraint [''+name+'']; ''
    from sysobjects 
    where xtype = ''F''open c1declare @c1 varchar(8000)fetch next from c1 into @c1while(@@fetch_status=0)    begin 
        exec(@c1)        fetch next from c1 into @c1
    endclose c1deallocate c1

复制代码

MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字

MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字

有没有一种方法可以选择其中一列仅包含,但包含任意数量的预定义值的行?

我一直在使用它,但是它返回的行中我的列至少包含一个值(我知道这正是它应该做的)。

但我正在寻找一种方法,仅选择在关键字列中仅包含我的关键字的行。

SELECT * FROM     `products`.`product` WHERE     keywords LIKE ''%chocolate%'' AND keyword LIKE ''%vanilla%'';

关键字示例: chocolate, sugar, milk, oats

使用上述关键字,我希望返回前两个结果,而不是后两个:

Product1: chocolate, sugarProduct2: chocolateProduct3: chocolate, sugar, milk, oats, branProduct4: chocolate, sugar, salt

我的专栏包含用逗号分隔的适用于该产品行的所有关键字的列表。

答案1

小编典典

由于您将列表存储为包含逗号分隔列表的字符串,而不是作为一组存储,因此MySQL对此将无济于事。当将其插入数据库时​​,MySQL将其视为单个字符串。从数据库中检索它时,MySQL会将其视为单个字符串。当我们在查询中引用它时,MySQL会将其视为单个字符串。


如果将“列表”存储为标准关系集,而将产品的每个关键字存储在表中的单独行中,则返回指定的结果集几乎是微不足道的。

例如,如果我们有此表:

CREATE TABLE product_keyword product_id      BIGINT UNSIGNED COMMENT ''FK ref products.id''keyword         VARCHAR(20)

将与特定产品相关联的每个关键字放在单独的行中:

product_id keyword---------- ---------         1 chocolate         1 sugar         2 chocolate         3 bran         3 chocolate         3 milk         3 oats         3 sugar         4 chocolate         4 salt         4 sugar

然后查找其中所有product关键字不是''chocolate''或的行''vanilla''

SELECT p.id  FROM product p  JOIN product_keyword k WHERE k.product_id = p.id    ON k.keyword NOT IN (''chocolate'',''vanilla'') GROUP BY p.id

- 或者 -

SELECT p.id  FROM product p  LEFT  JOIN ( SELECT j.id           FROM product_keyword j          WHERE j.keyword NOT IN (''chocolate'',''vanilla'')         GROUP BY j.id       ) k    ON k.id = p.id  WHERE k.id IS NULL

要获得具有至少一个关键字“ chocolate”和“ vanilla”但没有其他关键字相关联的产品,上面的查询与上面的查询相同,但具有附加的联接:

SELECT p.id  FROM product p  JOIN ( SELECT g.id           FROM product_keyword g          WHERE g.keyword IN (''chocolate'',''vanilla'')         GROUP BY g.id       ) h    ON h.id = p.id   LEFT  JOIN ( SELECT j.id           FROM product_keyword j          WHERE j.keyword NOT IN (''chocolate'',''vanilla'')         GROUP BY j.id       ) k    ON k.id = p.id  WHERE k.id IS NULL

我们可以解压缩那些查询,它们并不难。查询h返回具有至少一个关键字k的product_id的列表,查询返回具有除指定关键字之外的某些关键字的product_id的列表。此处的“技巧”(如果您要称呼它)是反联接模式……进行外部联接以匹配行,并包括没有匹配项的行,以及WHERE子句中的谓词,消除具有匹配项的行,从而保留不具有匹配项的产品中的行集。


但是将集合存储为单个字符列中的“逗号分隔列表”时,我们失去了关系代数的所有优点;没有简单的方法将关键字列表作为“集合”进行处理。

将整个列表存储为单个字符串,我们得到了一些可怕的SQL来获得指定的结果。

一种执行您指定的检查类型的方法是创建一组所有可能的“匹配项”,然后进行检查。这对于几个关键字是可行的。例如,要获取仅包含关键字''vanilla''和/或的产品列表''chocolate''(即,至少具有这些关键字之一并且没有任何其他关键字):

SELECT p.id  FROM product  WHERE keyword_list = ''chocolate''    OR keyword_list = ''vanilla''    OR keyword_list = ''chocolate,vanilla''    OR keyword_list = ''vanilla,chocolate''

但是很快将其扩展到三个,四个或五个关键字变得很笨拙(除非确保保证关键字以特定的顺序出现。而且要检查四个关键字中的三个关键字非常困难。

另一种(丑陋的)方法是将转换keyword_list为一个集合,以便我们可以像回答中的第一个查询那样使用查询。但是执行转换的SQL受可以从keyword_list提取的任意最大关键字数限制。

使用一些简单的SQL字符串函数从逗号分隔的列表中提取第n个元素是相当容易的,例如,从逗号分隔的列表中提取前五个元素:

SET @l := ''chocolate,sugar,bran,oats''SELECT NULLIF(SUBSTRING_INDEX(CONCAT(@l,'',''),'','',1),'''')                         AS kw1     , NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(@l,'',''),'','',2),'','',-1),'''') AS kw2     , NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(@l,'',''),'','',3),'','',-1),'''') AS kw3     , NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(@l,'',''),'','',4),'','',-1),'''') AS kw4     , NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(@l,'',''),'','',5),'','',-1),'''') AS kw5

但是那些仍然在同一行。如果要对它们进行检查,则需要做一些比较,我们需要检查每个检查以查看是否在指定列表中。

如果我们能够将这些关键字在一行上转换为一组行,并且每一行上都有一个关键字,那么我们可以在查询中使用类似于第一个查询的查询。举个例子:

SELECT t.product_id     , NULLIF(CASE n.i       WHEN 1 THEN SUBSTRING_INDEX(CONCAT(t.l,'',''),'','',1)       WHEN 2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(t.l,'',''),'','',2),'','',-1)       WHEN 3 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(t.l,'',''),'','',3),'','',-1)       WHEN 4 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(t.l,'',''),'','',4),'','',-1)       WHEN 5 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(t.l,'',''),'','',5),'','',-1)       END,'''') AS kw  FROM ( SELECT 4 AS product_id,''fee,fi,fo,fum'' AS l            UNION ALL          SELECT 5, ''coffee,sugar,milk''        ) t CROSS  JOIN ( SELECT 1 AS i         UNION ALL SELECT 2         UNION ALL SELECT 3         UNION ALL SELECT 4         UNION ALL SELECT 5       ) nHAVING kw IS NOT NULLORDER BY t.product_id, n.i

这使我们获得了单独的行,但是前5个关键字中的每个关键字都限于一行。很容易看出将如何扩展(n返回6,7,8,…)并扩展CASE中的WHEN条件以处理6,7,8

但是会有一些任意的限制。(t作为演示,我使用了一个内联视图,别名为,以返回两个“示例”行。该内联视图可以替换为对包含product_id和keyword_list列的表的引用。)

因此,该查询为我们提供了一个行集,就像从product_keyword上面作为示例给出的表中返回的那样。

在示例查询中,对该product_keyword表的引用可以用该查询替换。但这是很多丑陋的SQL,而且效率极低,它在每次运行查询时都会创建并填充临时MyISAM表。

MySQL:返回更新的行

MySQL:返回更新的行

我试图在扭曲的python中结合这两个查询:

SELECT * FROM table WHERE group_id = 1013 and time > 100;

和:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100

进入单个查询。有可能这样做吗?

我尝试将SELECT放在子查询中,但我不认为整个查询都会返回我想要的内容。

有没有办法做到这一点?(甚至更好,没有子查询)还是只需要坚持两个查询?

谢谢,

今天关于SQL:返回列名,其中列包含给定值sql 返回列名的介绍到此结束,谢谢您的阅读,有关Linq查询返回列表项,其中包含另一个列表、MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)、MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字、MySQL:返回更新的行等更多相关知识的信息可以在本站进行查询。

本文标签: