我已经搜索了半个小时,找不到任何资源说明各种数据库引擎支持的SQL ANSI标准级别.
看起来大多数引擎都提供了一定程度的支持,但我想确切知道官方支持的级别.
我主要对MySQL,PostgreSQL,SQL Server和Oracle感兴趣.
编辑:PostgreSQL有一个很好的合规页面,正是我所寻找的其他引擎:http://www.postgresql.org/docs/current/interactive/features.html
在SQL的Wikipedia页面上,有一些关于SQL中布尔逻辑的真值表.[1]维基百科页面似乎源于SQL:2003标准.
equals运算符(=)的真值表与SQL:2003草案中的IS运算符不同.
此外,维基百科文章指出"IS NULL"(<null predicate>)是一种特殊情况.
在SQL:2003中,似乎有一个"IS"操作符,它是一个常规运算符,如AND,NOT和OR.但是,<null谓词>仍然存在.
当IS是常规布尔运算符时,为什么<null谓词>存在?它是否确保您可以使用具有非布尔值的"IS NULL"构造而不使用类型coersion?不鼓励使用"= NULL"吗?
SQL:2011标准的工作方式不同吗?
[1]:关于SQL的维基百科
[2]:SQL:2011草案 PDF第335页
[3]:SQL:2003草案 PDF第397页
我试图使一个应用程序能够在Sql Server和PostgreSQL上运行.
我似乎无法找到一个基本的共同表达
select * from table where booleancol=false
Run Code Online (Sandbox Code Playgroud)
在SQL Server上我必须做(这是非常令人困惑的,因为位类型的默认值必须为true或false,但你不能将它们分配为true或false或对它进行测试)
select * from table where booleancol=0
Run Code Online (Sandbox Code Playgroud)
在PostgreSQL上我必须这样做
select * from table where booleancol is false
Run Code Online (Sandbox Code Playgroud)
在我们的程序中有很多查询都这样做,所以我更喜欢是否只有一些通用语法我可以使用而不是做if(dbformat=="postgres")..类型废话..
此外,我更喜欢将列保留为布尔/位类型,而不是将它们更改为整数类型..虽然这是一个选项..
我有下medleys表结合colors,fruits和ratings:
[medleys]
medley_id | color | fruit | rating
==============================================
1 red apple 25
2 blue pear 5
3 green apple 12
4 red apple 10
5 purple kiwi 5
6 purple kiwi 50
7 blue kiwi 3
8 blue pear 9
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写符合ANSI标准的SQL查询,该查询将结合每个唯一/不同color- fruit对并对每对的各个rating值求和.因此,如果您在上面的表上运行查询,它将生成以下结果集:
[query]
color | fruit | sum
===========================
red apple 35
blue pear 14
blue kiwi 3
green apple 12
purple kiwi 55
Run Code Online (Sandbox Code Playgroud)
因此,查询看到有两个 …
是否有符合ANSI SQL的SQL SERVER版本SELECT TOP n?
我在Postgres 9.1数据库中有以下表结构,但如果可能,理想的解决方案应该是DB不可知的:
Table: users |id|username| |1 |one | |2 |two | |3 |three | Table: items |id|userid|itemname|created | |1 |1 |a |timestamp| |2 |1 |b |timestamp| |3 |1 |c |timestamp| |4 |2 |d |timestamp| |5 |2 |e |timestamp| |6 |2 |f |timestamp| |7 |3 |g |timestamp| |8 |3 |h |timestamp| |9 |3 |i |timestamp|
我有一个查询(视图),提供下一个和上一个item.id.
例如
View: UserItems |id|userid|itemname|nextitemid|previtemid|created | |1 |1 |a |2 |null |timestamp| |2 |1 |b |3 |1 |timestamp| |3 |1 |c |4 |2 |timestamp| |4 |2 …
这一直困扰着我 - 为什么SQL语句中的GROUP BY子句要求我包含所有非聚合列?默认情况下应该包含这些列 - 一种"GROUP BY*" - 因为我甚至无法运行查询,除非它们全部包含在内.每列必须是聚合或在"GROUP BY"中指定,但似乎任何未聚合的列都应自动分组.
也许它是ANSI-SQL标准的一部分,但即便如此,我也不明白为什么.有人可以帮我理解这个约定的必要性吗?
我在10年使用SQL(SQL服务器,PostgreSQL的),并且仍然我从来没有使用过ANY/SOME和ALL关键字在我的生产代码.我遇到的所有情况我可以逃脱IN,MAX,MIN,EXISTS,,我认为这是更具可读性.
例如:
-- = ANY
select * from Users as U where U.ID = ANY(select P.User_ID from Payments as P);
-- IN
select * from Users as U where U.ID IN (select P.User_ID from Payments as P);
Run Code Online (Sandbox Code Playgroud)
要么
-- < ANY
select * from Users as U where U.Salary < ANY(select P.Amount from Payments as P);
-- EXISTS
select * from Users as U where EXISTS (select * …Run Code Online (Sandbox Code Playgroud) 我知道:
FIRST和SKIP;LIMIT;ROW_NUMBER();有人知道SQL ANSI的方式来执行结果分页吗?
在MS Sql Server中很容易创建自动增量字段.在我的系统中,我停止使用自动增量字段作为主键,现在我使用Guid了.太棒了,这个改变我有很多好处.但在另一个非主要关键领域,我真的需要实现"软自动增量".这是因为我的系统与数据库无关,所以我在c#中以编程方式创建了autoinc值.
我想在没有自动增量的数据库上自动增量字段的解决方案,您使用的解决方案是什么?为什么?关于这个有一些Sql Ansi声明吗?并直接从我的c#生成,是一个更好的解决方案?
PS:我知道从表中选择max(id)+1并不是真正的并发友好...