Microsoft SQL Server 有一个我认为非常明智的函数,如果转换不成功,try_cast()它返回一个null,而不是引发错误。
这使得可以使用CASE表达式或 acoalesce来回退。例如:
SELECT coalesce(try_cast(data as int),0);
Run Code Online (Sandbox Code Playgroud)
问题是,PostgreSQL 有没有类似的东西?
提出这个问题是为了填补我知识中的一些空白,但也有一个一般原则,即有些人更喜欢对某些用户错误做出不那么剧烈的反应。null在 SQL 中返回 a比错误更容易。例如SELECT * FROM data WHERE try_cast(value) IS NOT NULL;。根据我的经验,如果有 B 计划,有时可以更好地处理用户错误。
我试图获得什么是第一范式的明确版本。我阅读的所有内容都略有不同。
许多权威,例如 Date,说根据定义,关系总是处于第一范式,而其他人则给出了要求列表。这意味着对 1NF 的要求从零到很多。
我想区别在于表和关系之间的区别:表可能是一团糟,而关系遵循某些限制。关系在 SQL 中表示为表的事实因此造成了一些混淆。
我特别关注 1NF,因为它与 SQL 数据库有关。问题是:需要什么属性来确保表处于第一范式?
许多权威建议,如果一个表代表一个关系,那么它已经在 1NF 中。这将 1NF 的定义推回到关系的定义。
以下是 1NF 中表的一些属性:
[1] 技术上属性是无序的,但在表格中,行数据必须与列标题的顺序相同。然而,实际的顺序是微不足道的。
在多个数据上:
原子数据的概念是一个项目不能被进一步分解。这个概念是有限制的,因为虽然从技术上讲,一切都可以令人厌烦地分解,但实际上不能进一步分解所讨论的数据,这取决于数据的使用方式。
例如,完整地址或全名通常应该进一步细分,但可能不应该进一步细分诸如给定名称或城镇名称之类的组件,尽管它们可以作为字符串。
至于重复的列,它是一个设计不良列具有近重复列,例如phone1,phone2等。通常,重复数据指示用于一个附加的相关表的需要。
依赖
行之间不应该有任何关系,除了它们符合相同的标题。
列之间也应该没有关系,但我相信这是更高范式的主题。
问题是:1NF 的定义中有多少上述内容?独立行位也进入了吗?
Microsoft SQL Server 本身是否支持replace使用通配符的某种功能?我认为正则表达式本身不可用。
我注意到有一个PATINDEX函数可以用来将一个解决方案组合在一起——有没有更简单的方法?
例如REPLACE(data,'[xy]','q'),以取代x或y与q。
出于教学和测试目的,我想运行 MySQL 而无需实际安装它。
我已经为 Macintosh 和 Windows 找到了可移植的 PostgreSQL,这很好,但是在 mySQL 中找不到相同的。
我知道我可以从流行的 Web 服务器包(例如 AMPPS 和 XAMPP)运行 MySQL,但它们无论如何都需要安装,并且超出了我的要求。
是否有适用于 OS X 和 Windows 的便携式应用程序可以完成这项工作?
谢谢
据我所知,SQLite 不强制定义表数据类型——它具有动态类型。例如,它允许您将字符串插入到数字字段中,或超出字符串的长度。
如果是这样,那么在CREATE TABLE语句中定义数据类型有什么意义?
请原谅这里任何定义的松散,但我试图探索一个简单的概念。
一个主键唯一标识一行。表中可能还有其他列具有唯一值,因此它们也可以唯一标识一行(候选键),但主键是为任务指定的。
使主键更有用的属性包括:
由于这些原因,我通常建议主键没有内在价值,因此永远没有理由更改或回收值。也就是说,它应该是没有意义的。
我见过包含某种代码的主键,例如基于名称的客户端代码。明显的问题是 (a) 如果客户端名称更改,那么 PK 也应该更改,以及 (b) 与具有相似名称的客户端发生冲突的风险太大。
半个例外是使用自动递增的数字,它具有序列号的次要含义。但是,它仍然很稳定。
问题是,在什么情况下,如果有的话,最好使用具有其他实际含义的主键?也就是说,PK应该是任意的,并且你通常可以通过序列号获得的建议有什么问题吗?
我一直教导将格式化数据存储在表格中是不正确的。例子包括:
+----------------+----+ | 数据 | 好的 | +----------------+----+ | 0370101234 | ? | +----------------+----+ | 03 7010 1234 | | +----------------+----+ | (03) 7010 1234 | | +----------------+----+
(为什么不支持表格?!)
数据是一个澳大利亚电话号码,通常有 10 位数字,包括区号。
包括格式间距或字符会引入歧义,因此更难排序或搜索。
问题是:标准或关系理论中有没有涵盖这个问题的内容?
编辑
这不是关于电话号码的问题。我用应该以最简单的形式存储的数据说明了一个点,即使它是用格式化字符显示的。
其他示例包括$显然从未与货币值一起存储的符号,以及有其自身问题的千位分隔符。
我正在教一门课,我想向我的学生证明,如果没有明确的ORDER BY. 我观察到即使ORDER BY查询中不存在SQL Server 似乎也返回有序结果。这是一个问题,因为我担心我的学生会在这一点上感到困惑。
观察到的行为示例:
GROUP BY,结果集似乎按最后一列的顺序排列。GROUP BY this, that,以数据的顺序结束,这很奇怪,尤其是在没有索引的情况下。我还没有在其他数据库(如 MySQL、PostgreSQL 和 SQLite)中观察到这种行为。SQL Server 是否有一些根本不同的地方,即使没有ORDER BY?
现在在我看来,在没有被询问的情况下对数据进行排序是一个额外的不必要步骤,会浪费处理时间。真的吗?
是否有某种全局设置可以禁用这种行为?有没有办法让 SQL Server 停止对数据进行排序?
这也使得向学生证明数据不是自动排序的变得更加困难。
谁能给我一个简单的演示脚本,显示结果从执行到执行的变化顺序?
出于演示目的,我有一个示例表,其中有一varchar列名为numberstring以下值:
-4
32
0
4
16
8
-8
1024
Run Code Online (Sandbox Code Playgroud)
当选择使用时ORDER BY numberstring,我发现不同的用户得到不同的结果。
有些得到:
-4, -8, 0, 1024, 16, 32, 4, 8
Run Code Online (Sandbox Code Playgroud)
而有些人得到:
0, 1024, 16, 32, -4, 4, -8, 8
Run Code Online (Sandbox Code Playgroud)
不知何故,第二个结果似乎忽略了减号,即使数据以其他方式排序为字符串数据。
据我所知,底层服务器是 Microsoft SQL Server Express 的标准安装,没有任何特殊选项。该版本是最近几年的版本,但使用相同版本的用户仍然报告不同的结果。
设置中是否有某些内容会影响结果,我如何从 SSMS 中查看它?
据我所知,数据库服务器和 SSMS 在澳大利亚设置,仅使用默认设置。数据类型是varchar(max).
sql-server ×3
datatypes ×2
postgresql ×2
cast ×1
collation ×1
group-by ×1
mac-os-x ×1
mysql ×1
order-by ×1
primary-key ×1
replace ×1
sqlite ×1
t-sql ×1
windows ×1