我在Oracle 官方文档中看到了这个声明:
在 Microsoft SQL Server 中,只有具有可变长度数据类型的列才能存储 NULL 值。当您创建一个允许 NULL 具有固定长度数据类型的列时,该列会自动转换为系统可变长度数据类型...
我从来没有在SQL Server 文档中读到过这个,也没有经历过这样的事情。相反:在 SQL Server 中,固定长度的数据类型(例如 int 和 float,还有 char)被大量使用并且即使在可为 NULL 的情况下也非常有效地存储。
这个 Oracle 声明背后有什么理由吗?!
我有一个parcels当前包含列owner_addr1, owner_addr2,的表owner_addr3。有时,后两个字段中的一个或两个字段为空。我想将它们组合成一个新的字段,owner_addr上面的每个字段//都在它们之间连接。
但是如果一个或多个原始列是 NULL,我不想连接//到结果列。因此,举例来说,如果owner_addr1是123 4th Avenue SE和owner_addr2和owner_addr3的NULL,然后我想要的结果列只是123 4th Avenue SE,没有123 4th Avenue SE // //(如果我只是做了这会发生CONCAT()与//空字符串之间......我只是想添加//非之间的NULL列,或将其如果只有一个非NULL列,则完全退出。
有没有一种简单的方法可以在 Postgresql 中进行这种条件连接,它会遗漏空行?或者我应该写一个python脚本来做到这一点?
在我的旧数据库中,很多时候模式不必要地允许特定列的空条目。为了帮助找出特别是哪些列,我需要对 SQL Server 2008 进行一些超出我专业水平的查询。我的目标是稍微收紧模式并使自己免于处理代码中的空情况。
一种帮助我解决问题的粗略方法(选项 1)是只获取包含至少一个空条目的所有记录(并选择 *),然后对不包含空条目的列进行目视扫描。我当然可以只使用Where columnA IS NULL OR columnB IS NULL OR columnC IS NULL,但这对于有很多列的表来说变得乏味。此数据库中的某些表包含二十多列!此外,总共有大约500张桌子。因此,通用解决方案是最好的。
以下是三个让我满意的答案选项:
谢谢!
我想要一个表中至少有一个非NULL数据条目的那些列的列表。
换句话说,我想获取以下返回至少一个条目的列名称:
SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
SELECT column_name
FROM information_schema.columns
WHERE table_name = "table_name"
AND EXISTS (
SELECT DISTINCT column_name FROM table_name WHERE column_name IS NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
但这也会返回所有条目所在的列名NULL。
那么如何只获取那些没有NULL条目的列呢?
这个 MySQL 表让我困惑了一会儿:
mysql> desc quux;
+---------------------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------+-----------------------+------+-----+---------+----------------+
| foobar | int(11) | NO | | NULL | |
(...)
mysql> show create table quux;
(...)
`foobar` int(11) NOT NULL,
(...)
Run Code Online (Sandbox Code Playgroud)
由于foobar从未使用 DEFAULT 子句创建该字段,因此它会自动分配 DEFAULT NULL。然而,乍一看,这似乎与它也被定义为 NOT NULL 的事实相矛盾。
然后我意识到这个模式旨在foobar在添加新记录时强制插入一个值(和一个非 NULL 值)。
这是一种可以接受的方法,还是有更好的方法?
我有点像 SQL 新手。
我一直在尝试创建一个TAG从其他 5 个列调用的自动生成的列,其中一些可以保留 NULL 标记。
用于创建自动生成列的语法是:
[Tag] AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])
Run Code Online (Sandbox Code Playgroud)
如果五列都没有保留 NULL,则自动生成 OK ,但是如果我尝试使用包含 NULL 的任何一列创建一行,自动生成不起作用,并将TAG列留空,即使它创建了行确定所有单独的列数据。
有没有办法让自动生成与 NULL 一起工作?
如果我有一张像这样的桌子:
Food
-----------------
name | price | x
Run Code Online (Sandbox Code Playgroud)
假设我在 name 和 price 上创建了一个索引,但是数据库在某些行中为 name 和 price 提供了一堆空值。PostgreSQL 会自动跳过索引这些行吗?我听说这种行为可能在以后的版本中有所改变。
考虑来自 Microsoft SQL 文档页面的以下信息:
SQL Server 数据库引擎优化位列的存储。如果表中有 8 个或更少位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。
请参阅:https : //docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017
所以,如果我创建一个这样的新表:
CREATE TABLE MyTable (
Id int PRIMARY KEY,
Value1 bit,
Value2 bit,
Value3 bit,
Value4 bit,
Value5 bit,
Value6 bit,
Value7 bit,
Value8 bit)
Run Code Online (Sandbox Code Playgroud)
...然后一行中的所有位列(Value1、Value2、...Value8)应占用一个字节。或者?
当我们仔细观察时,一行的 Value1 字段内部可以包含值 0、1 或 NULL。这意味着该字段实际上是三态值或三元值。2 个这样的值可以表示 3*3=9 个值的字典。8 个这样的值是一个包含 6561 个值的字典。
如果我们考虑这样一行的内存占用,8 位应该占用一个字节。这意味着这一字节编码 6561 个值而不是 256 个值。这显然是错误的。
因此,要么 MS SQL 文档具有误导性,要么我们在这里谈论一些量子计算。当然是前者,但我真正想知道的是这个问题的答案:可空位(当然,SQL Server 位默认可以为空)是如何真正存储在 SQL Server 底层结构中的?
我有一个关于这个查询计划的问题。
我们在测试环境中有一个表 Order_Details_Taxes,它有 11,225,799 行。该表有一个列 OrdTax_PLTax_LoadDtl_Key,它在每一行上都是 NULL。此测试环境的配置方式使此列始终为 NULL。此列上有一个索引。
我使用列的 NULL 值对该表运行了一些查询。NULL INNER JOIN 永远不会产生任何结果。
declare @Keys table (KeyValue decimal(15,0))
insert into @Keys (KeyValue) values (null)
select OrdTax_PLTax_LoadDtl_Key
from @Keys
inner join Order_Details_Taxes
on OrdTax_PLTax_LoadDtl_Key = KeyValue
select *
from @Keys
inner join Order_Details_Taxes
on OrdTax_PLTax_LoadDtl_Key = KeyValue
Run Code Online (Sandbox Code Playgroud)
这些是查询计划中的第一个查询。第一个select从亿行表开始并连接到@Keys。第二个select从@Keys 开始,但它对这个表进行聚集索引扫描。
我知道在大多数情况下临时@Tables 是有问题的,所以我将查询更改为使用临时 #Table:
if object_id ('tempdb..#Keys') is not null
drop table #Keys
create table #Keys (KeyValue decimal(15,0))
insert into #Keys (KeyValue) values (null)
select OrdTax_PLTax_LoadDtl_Key …Run Code Online (Sandbox Code Playgroud) 使用 PostgreSQL 11,我有下表,大约有 4.5 亿行:
postgres=> \d+ sales
Table "public.sales"
Column | Type | Modifiers | Storage | Stats target | Description
-----------------------------------+-----------------------------+------------------------------------+----------+--------------+-------------
created_terminal_id | integer | not null | plain | |
company_id | integer | not null | plain | |
customer_id | integer | | plain | |
sale_no | character varying(20) | not null | extended | |
sale_type | smallint | not null | plain | |
source_type | smallint | not null | plain …Run Code Online (Sandbox Code Playgroud)