繁体   English   中英

如何使用错误的数据类型对SQL中的字段进行计数

[英]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_CASTTRY_CONVERT 但是请注意,转换失败会返回NULLNULL对于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和s​​mallmoney(Transact-SQL)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM