[英]How to do a count of fields in SQL with wrong datatype
我正在尝试将旧数据从另一个系统导入到我们的系统中。 我遇到的问题是旧数据很脏-非常脏! 我们有一个字段,该字段应该是整数,但有时是varchar,并且该字段定义为varchar ...
在SQL Server中,如何进行选择以显示数据为varchar的那些记录,而不是int?
谢谢
如果要查找第1行,其中某列包含任何非数字字符或长于9个字符(两种情况都意味着我们不能假定它适合int
,请使用类似以下内容的方法:
SELECT * FROM Table WHERE LEN(ColumnName) > 9 or ColumnName LIKE '%[^0-9]%'
并不是说LIKE
条件中存在负数-我们正试图找到一个至少包含一个非数字字符的字符串。
更现代的方法是使用TRY_CAST
或TRY_CONVERT
。 但是请注意,转换失败会返回NULL
而NULL
对于int
完全有效!
SELECT * FROM Table WHERE ColumnName is not null and try_cast(ColumnName as int) is null
ISNUMERIC
不适合。 它回答了一个没人想问的问题(IMO)-“此字符串可以转换为任何数字数据类型吗(我不在乎是哪种,也不希望您告诉我是哪种)? “
ISNUMERIC('$,,,,,,,.')
是1
。 那应该告诉您所有您需要了解的有关此功能的信息。
1如果仅要计数,请按照问题的标题,用COUNT(*)
代替*
。
在SQL Server中,如何进行选择以显示数据为varchar而不是int的那些记录?
我会喜欢
CREATE TABLE T
(
Data VARCHAR(50)
);
INSERT INTO T VALUES
('102'),
(NULL),
('11Blah'),
('5'),
('Unknown'),
('1ThinkPad123'),
('-11');
SELECT Data -- Per the title COUNT(Data)
FROM
(
SELECT Data,
cast('' as xml).value('sql:column("Data") cast as xs:int ?','int') Result
FROM T --You can add WHERE Data IS NOT NULL to exclude NULLs
) TT
WHERE Result IS NULL;
返回:
+----+--------------+
| | Data |
+----+--------------+
| 1 | NULL |
| 2 | 11Blah |
| 3 | Unknown |
| 4 | 1ThinkPad123 |
+----+--------------+
如果您不能使用TRY_CAST()
函数,如果您使用的是2012+版本,那么我建议您使用TRY_CAST()
函数,例如
SELECT Data
FROM T
WHERE Data IS NOT NULL
AND
TRY_CAST(Data AS INT) IS NULL;
最后,我会说由于(from docs)不要使用ISNUMERIC()
函数。
注意
对于一些不是数字的字符,例如加号(+),减号(-)和有效的货币符号(例如美元符号($)),ISNUMERIC返回1。 有关货币符号的完整列表,请参见money和smallmoney(Transact-SQL) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.