簡體   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