我在Mytable中有一些值='NA' 我想把这个值保留为NULL。 所以我写道:
INSERT INTO Mytable
VALUES(NULL)
WHERE VALUES('NA');
但我没有工作。 我没有列出列的名称,因为可能所有列都可以有一些'NA'值。 我希望有人有这个想法。 问候 萨姆
答案 0 :(得分:4)
UPDATE Mytable
SET value = NULL
WHERE value = 'NA';
是的,您必须为要更新的每个列/属性执行此操作。
答案 1 :(得分:1)
UPDATE Mytable SET value = NULL WHERE value = 'NA'
答案 2 :(得分:1)
要在多列中替换'NA'
与NULL
的匹配项,对于表中的所有行,您可以在单个更新查询中执行此操作。诀窍是,当您不希望更改值时,将列的当前值分配回列。
例如:
UPDATE Mytable t
SET t.column_one = IF(t.column_one='NA',NULL,t.column_one)
, t.column_two = IF(t.column_two='NA',NULL,t.column_two)
, t.column_fee = IF(t.column_fee='NA',NULL,t.column_fee)
WHERE t.column_one = 'NA'
OR t.column_two = 'NA'
OR t.column_fee = 'NA'
注意:
对需要进行替换的每个列重复列分配。 (上面的示例引用了三列,名为column_one
,column_two
和column_fee
。我不知道表中列的名称;您需要替换这些列使用表格中列的实际名称。)
WHERE
子句是可选的;如果没有WHERE子句,查询将具有相同的净结果。 (如果没有WHERE
子句,查询将更新表中的每一行;任何不在三列之一中具有“NA”的行都不会更改,因为将为所有列分配其当前值。
对于很多列,在单个操作中执行它更有效,在一个语句中对一行应用多个更改,而不是对每个列进行更新的单独语句。)
表达式IF(a,b,c)
将表达式a
计算为布尔值;如果返回TRUE,则返回表达式b
,否则返回表达式c
。
要查看其工作原理,可以运行SELECT语句(删除SET子句,并使用SELECT列表中的SELECT和相关表达式替换UPDATE
关键字:
例如:
SELECT t.column_one AS _one_old
, IF(t.column_one='NA',NULL,t.column_one) AS _one_new
, t.column_two AS _two_old
, IF(t.column_two='NA',NULL,t.column_two) AS _two_new
, t.column_fee AS _fee_old
, IF(t.column_fee='NA',NULL,t.column_fee) AS _fee_new
FROM Mytable t
WHERE t.column_one = 'NA'
OR t.column_two = 'NA'
OR t.column_fee = 'NA'
_old
列返回列中的现有值; _new
列返回将分配的值(通过我的答案中的UPDATE语句。)
当该列中的现有值为IF()
时,该查询的结果将验证'NA'
表达式将返回NULL;当列中的现有值不是IF()
时,它还会确认'NA'
表达式将返回现有值。
<强>后续强>
有20个不同的表,每个表有12列,我会利用MySQL中的information_schema.columns
表来帮助我生成所需的表达式。
这样的事情:
SELECT CONCAT(' , t.'
,c.column_name,' = IF(t.'
,c.column_name,'=''NA'',NULL,t.'
,c.column_name,')') AS expr
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase' -- the name of your database
AND c.table_name = 'mytable' -- the name of your table
AND c.data_type IN ('varchar','char') -- only character type columns
ORDER BY c.ordinal_position
将返回以下内容:
expr
-------------------------------------
, t.fee = IF(t.fee='NA',NULL,t.fee)
, t.fi = IF(t.fi='NA',NULL,t.fi)
, t.fo = IF(t.fo='NA',NULL,t.fo)
, t.fum = IF(t.fum='NA',NULL,t.fum)
所以,这并没有实际更新表,它只是一种避免输入一堆SQL表达式的方便方法。您可以复制该结果集,并使用它来形成类似于我在上面的答案中显示的语句。 (显然,您会省略您不想更改的行,并且第一个逗号需要更改为SET
关键字,并且该语句的其余部分需要包含此内容。
就个人而言,我不会打扰WHERE子句,因为如果它有很多列,那么查询将会对表格进行全面扫描。
SELECT CONCAT(' OR t.',c.column_name,' = ''NA''') AS expr
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase' -- the name of your database
AND c.table_name = 'mytable' -- the name of your table
AND c.data_type IN ('varchar','char') -- only character type columns
ORDER BY c.ordinal_position
这将返回如下内容:
expr
----------------------
OR t.fee = 'NA'
OR t.fi = 'NA'
OR t.fo = 'NA'
OR t.fum = 'NA'
注意:请注意,不要将数字列与'NA'
进行比较,因为MySQL会将'NA'
评估为零的数值({ {1}})在数字上下文中。