我想知道是否可以在具有NOT NULL约束的列中插入“空”字符串。
我正在使用 PostgreSQL,尽管这可能也适用于其他数据库管理系统。
查询如下所示
INSERT INTO originators(originator, id, regexp)
VALUES ('null', 1, -1);
Run Code Online (Sandbox Code Playgroud)
这是表设计:
CREATE TABLE originators
(
originator varchar(30) NOT NULL
, id int NOT NULL
, regexp int NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
这里原始列有一个NOT NULL约束,所以表中不应该有 NULL 值。
但是,当我查询表时,我看到的是:
????????????????????????????????? ? 创始者?ID ?正则表达式? ????????????????????????????????? ? 空值 ?1 ? -1 ? ?????????????????????????????????
这怎么可能?
我有一个应用程序,用户可以在其中做出决定:
我开始使用可以为空的布尔列。
但是事情变得相当复杂,因为我的框架 (django) 没有提供用于开箱即用的搜索表单编码的输入字段。
在搜索表单中,我需要四种状态:
相关问题:https : //stackoverflow.com/questions/38307866/search-form-for-nullbooleanfield
一个旧的经验法则再次出现在我的脑海中:
避免可为空的数据库列。
我想将数据类型从可为空的布尔字段更改为不同的类型。
可以具有三种状态的列的哪种数据类型:是、不是、未知?
我使用 Postgres 9,但 AFAIK 这对于这个问题应该无关紧要。
我正在使用 MySQL 和 PhpMyAdmin,我有一个名为的表items- 结构如下;
+------+---------+------+---------+
| name | type | Null | Default |
+------+---------+------+---------+
| id | int(11) | No | None |
+------+---------+------+---------+
| year | int(4) | Yes | Null |
+------+---------+------+---------+
Run Code Online (Sandbox Code Playgroud)
在 PhpMyAdmin 中,我运行以下查询;
UPDATE `item` SET `item_publication_year` = '' WHERE `item_id` = '5'
Run Code Online (Sandbox Code Playgroud)
这将成功执行。
然后我运行这个查询;
SELECT * FROM `item` WHERE `item_id` = '5'
Run Code Online (Sandbox Code Playgroud)
这将成功执行并产生以下结果;
+-----+------+
| id | year |
+-----+------+
| 5 | 0 |
+-----+------+
Run Code Online (Sandbox Code Playgroud)
为什么是这个year领域0——不应该是 …
经过一段时间寻找答案后,我收到了很多问题,说要使用coalesce、concat()等,但我需要的是:
桌子:
create table nulos ( nome varchar(max))
alter table nulos add cidade varchar(max)
Run Code Online (Sandbox Code Playgroud)
价值观:
insert into nulos values ( 'rafael','são paulo'),('juliana',null)
Run Code Online (Sandbox Code Playgroud)
我需要将这个表中的值连接到一个插入中,如下所示:
select 'insert into nulos (nome,cidade) values ('+nome+','+cidade+')'
from nulos
Run Code Online (Sandbox Code Playgroud)
和选择的结果:
insert into nulos (nome,cidade) values (rafael,são paulo)
NULL
Run Code Online (Sandbox Code Playgroud)
如何在此串联中使用 NULL 值?每个答案都说用''or替换空值'_',但我需要的是:
insert into nulos (nome,cidade) values (rafael,são paulo)
insert into nulos (nome,cidade) values (Juliana,NULL)
Run Code Online (Sandbox Code Playgroud)
SET CONCAT_NULL_YIELDS_NULL on 不是一个选项,因为它只是删除 NULL 值,我需要插入它。
我想LEFT JOIN在两个表上做一个,其中一个表有一个日期时间列,另一个表有一个日期列。当我在 SQL Server 中工作时,我曾经CONVERT将日期时间更改为日期。然后我写了 join 语句:
SELECT CONVERT(date,db1.dbo.table1.datecolumn), db2.dbo.table2.datecolumn
FROM db1.dbo.table1
LEFT JOIN db2.dbo.table2
ON db1.dbo.table1.datecolumn = db2.dbo.table2.datecolumn
Run Code Online (Sandbox Code Playgroud)
查询返回 table1 中的日期列,但 table2 中的列仅填充为 NULL 值。我不确定我做错了什么。我尝试CAST了CONVERT,而不是,但没有运气。转换有什么事情发生吗?任何帮助表示赞赏。
我需要按两列的差异对表格进行排序
SELECT (first - second) AS dif
FROM table1
ORDER BY dif DESC
Run Code Online (Sandbox Code Playgroud)
但两列可以NULL。在这种情况下,它返回错误:
BIGINT UNSIGNED value is out of range
Run Code Online (Sandbox Code Playgroud)
这个错误的解决方案是使用IFNULL(col,0),但问题是,我需要dif是NULL,如果任一列是NULL
我遇到了这个存储过程的问题。当用户选择“是”时,它应该按照它在“是”的 if 语句中所说的那样做,但它什么也不做,也不向数据库中插入任何内容。它适用于“否”条件。你能告诉我什么不起作用吗?
ALTER PROCEDURE [dbo].[sp_ff_Insert_ProjectApproved]
(
@project_no varchar(6)
,@sequence_no int
,@grant_programme varchar(2)
,@jobs_approved int
,@grant_amount int
,@Committee varchar(4)
,@Meeting_no int
,@Minute_Item int
,@jobs_maintained int
,@approval_date date
,@approval_by int
,@comments varchar(1600)
,@created_by int
,@created_date datetime
,@updated_by int
,@updated_date datetime
,@approval varchar(5)
,@ratify varchar(3)
--,@research_type varchar(1)='T'
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
DECLARE @ReturnValue int,
@post_approval_status varchar(3),
@approval_status varchar(3),
@current_status varchar(3)
set @current_status = ( SELECT approval_status from approval_master_tbl
WHERE project_no = @project_no …Run Code Online (Sandbox Code Playgroud) 报告当前计算“总计”列,如下所示:
,CASE WHEN ISNULL(CLM_BREAKFAST_TYPEA.MealsA, 0) +
ISNULL(CLM_BREAKFAST_TYPEB.MealsB, 0) = 0
THEN ''
ELSE CONVERT(VARCHAR(15),
ISNULL(CLM_BREAKFAST_TYPEA.MealsA, 0) +
ISNULL(CLM_BREAKFAST_TYPEB.MealsB, 0))
END AS 'MealsTotal'
Run Code Online (Sandbox Code Playgroud)
当总数等于零而不是 NULL 或“0”时,如何获得空白单元格,并避免进行两次计算?
我有两个要加入的表
|id |profit|
| 1 | 1234 |
| 2 | 1345 |
| 4 | 1454 |
| 5 | 1254 |
Run Code Online (Sandbox Code Playgroud)
和另一张桌子
| id | x loss | y loss |
| 2 | 34312 | 4354 |
| 3 | 35614 | 4365 |
| 4 | 36615 | 4321 |
Run Code Online (Sandbox Code Playgroud)
并结合两者,这将是我想要的结果
| id | profit | x loss | y loss |
| 1 | 1234 | Null | Null |
| 2 | 1345 | …Run Code Online (Sandbox Code Playgroud) 这是我的临时表:
CREATE TABLE #test123(
c1 float,
c2 float,
c3 float,
c4 float,
c5 float
);
INSERT #test123(c1,c2,c3,c4,c5)
VALUES (2,3,NULL,1,2),
(2,NULL,NULL,1,2),
(2,3,NULL,NULL,2),
(NULL,3,NULL,1,NULL),
(2,3,NULL,1,2);
Run Code Online (Sandbox Code Playgroud)
当我运行以下查询来替换第一列中的所有 NULL 时
INSERT INTO #test123 (c1) VALUES (ISNULL(c1,0));
Run Code Online (Sandbox Code Playgroud)
或者
INSERT INTO #test123 (c1) SELECT CASE WHEN c1 IS NULL THEN 0 END AS c1;
Run Code Online (Sandbox Code Playgroud)
我两次都收到错误“无效的列名 'c1'”。
的语法(来源)INSERT INTO是:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
Run Code Online (Sandbox Code Playgroud) 我有一个WHERE要在其中使用CASE表达式的子句。但是,我的CASE表达式需要检查字段是否为IS NULL.
如果@UserRole变量值 = 'Analyst',则SupervisorApprovedBy列值必须为NULL. 否则,我是说返回所有数据,即SupervisorApprovedBy = SupervisorApprovedBy.
我需要更改以下内容吗?
WHERE SupervisorApprovedBy =
CASE
WHEN @UserRole = 'Analyst' THEN NULL
ELSE SupervisorApprovedBy
END
Run Code Online (Sandbox Code Playgroud)
我不能使用=for NULL。经测试无效。
我希望返回所有行,包括那些 where SupervisorApprovedBy IS NOT NULL。