我需要在整数列和字符串列中插入空值,但是在获取值之前将其插入数据集中,对于字符串而言为“ ---”,对于INT而言为“ NA”当您将这些值插入为void时,我正在使用SQL Sever,而我的查询就是这样。
INSERT INTO BOEMIC01
(MICRO_DATE, MICRO_YEAR, MICRO_MONTH, MICRO_WEEK, MICRO_DIVISION, MICRO_SUBDIVISION, MICRO_CODE_COUNTRY, MICRO_COUNTRY, MICRO_CODE_CENTER, MICRO_CENTER, MICRO_FREQ, MICRO_TOTAL_M, MICRO_TOTAL_Y, MICRO_TOTAL_Z, MICRO_ID_PROCESS, MICRO_DESC_PROCESS, MICRO_TOTAL_A, MICRO_TOTAL_B, MICRO_TOTAL_C, MICRO_ID_POINT, MICRO_DESC_POINT, MICRO_CODE_MATERIAL, MICRO_DESC_MATERIAL, MICRO_TOTAL_D, MICRO_TOTAL_E, MICRO_TOTAL_F) VALUES
(
'2019-01-15',
'2019',
'1',
'3',
'X',
'Y',
'P001',
'USA',
'USA1',
'USA2',
'Daily',
'2',
'2',
'0',
'158',
'Enva',
'2',
'2',
'0',
'344',
'2',
'---', --NULL
'---', --NULL
'NA', --NULL
'NA', --NULL
'NA' --NULL
)
答案 0 :(得分:0)
要插入NULL
值,请使用NULL
关键字。如:
insert into t (col)
values (null);
要插入默认值通常为null
,只需将列完全排除在列列表之外即可:
insert into t (col1)
values ('happy value');
col2
将设置为其默认值-如果未定义其他默认值,则为NULL
。
如果要从其他来源插入值,请使用try_convert()
或nullif()
例如:
insert into t (col_str, col_int)
values (nullif(@col_str, '---'), try_convert(int, @col_int));
答案 1 :(得分:0)
此外,作为标准做法,您应始终使用查询参数为查询提供任何文字值,以避免出现“ SQL注入”问题。例如,您的查询现在将显示为:
INSERT INTO BOEMIC01
(MICRO_DATE, MICRO_YEAR, MICRO_MONTH, [...])
VALUES(?, ?, ? [...])
注意?
符号,并注意它们不在引号中。
然后,当您执行查询时,您将同时提供SQL字符串和将按出现顺序替换每个?
的值的数组。现在,SQL不能将任何值误解为“ SQL的一部分”,因为它不是 。每次都可以向同一SQL字符串提供不同的参数值集。
您可以使用BJones的注释中提到的诸如NULLIF()
之类的函数:NULLIF('---', ?)
...该参数的值将传递给NULLIF
函数作为第二个论点。我认为这是处理您的要求的一种好方法(它应该作为“答案”提供)。
答案 2 :(得分:0)
这实际上取决于值的来源,但是例如,如果此插入内容位于存储过程中,并且这些值是通过参数输入的,则以下内容显示了如何确保指定情况下的null
值。 (为简便起见,省略了其他重要专栏文章):
INSERT INTO BOEMIC01 (... MICRO_CODE_MATERIAL, MICRO_DESC_MATERIAL, MICRO_TOTAL_D, MICRO_TOTAL_E, MICRO_TOTAL_F)
select ...
, case when @MICRO_CODE_MATERIAL != '---' then @MICRO_CODE_MATERIAL else null end
, case when @MICRO_DESC_MATERIAL != '---' then @MICRO_CODE_MATERIAL else null end
, try_convert(int, @MICRO_TOTAL_D)
, try_convert(int, @MICRO_TOTAL_E)
, try_convert(int, @MICRO_TOTAL_F)
但是,如果要从客户端应用程序传递此数据,请在客户端进行转换。