[英]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.