以上就是给各位分享SQL:返回列名,其中列包含给定值,其中也会对sql返回列名进行解释,同时本文还将给你拓展Linq查询返回列表项,其中包含另一个列表、MSSQL获取数据库名,表名,列名,说明等信息(
以上就是给各位分享SQL:返回列名,其中列包含给定值,其中也会对sql 返回列名进行解释,同时本文还将给你拓展Linq查询返回列表项,其中包含另一个列表、MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)、MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字、MySQL:返回更新的行等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- SQL:返回列名,其中列包含给定值(sql 返回列名)
- Linq查询返回列表项,其中包含另一个列表
- MS SQL 获取数据库名,表名,列名,说明等信息(SQL Server 2005 测试通过)
- MySQL返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字
- MySQL:返回更新的行
SQL:返回列名,其中列包含给定值(sql 返回列名)
我想知道是否可以在SQL Server中运行一个命令/存储的程序,该程序将为我提供包含表中给定数据的列的名称。
因此,如果我要查询,请给我该表中所有包含值75的列。我不希望该行。只是表中的列名…这可能吗?
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 测试通过)
/**************************************************************************************************************
、获取所有用户名:
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返回所有行,其中一列包含集合中的任何关键字,但仅包含关键字
有没有一种方法可以选择其中一列仅包含,但包含任意数量的预定义值的行?
我一直在使用它,但是它返回的行中我的列至少包含一个值(我知道这正是它应该做的)。
但我正在寻找一种方法,仅选择在关键字列中仅包含我的关键字的行。
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:返回更新的行
我试图在扭曲的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:返回更新的行等更多相关知识的信息可以在本站进行查询。
本文标签: