如何检查值是否是SQLite中的数字

时间:2015-09-11 17:11:41

标签: sql sqlite

我有一个包含数字和其他字符串值的列(例如“?”,“???”等)

是否可以在SQLite中的where子句中添加“is number”条件?类似的东西:

select * from mytable where isnumber(mycolumn)

9 个答案:

答案 0 :(得分:10)

来自documentation

  

typeof(X)函数返回一个字符串,表示表达式X的数据类型:" null"," integer"," real",&# 34; text",或" blob"。

您可以使用where typeof(mycolumn) = "integer"

答案 1 :(得分:6)

select * from mytable where abs(mycolumn) <> 0.0 or mycolumn = '0'

http://sqlfiddle.com/#!5/f1081/2

基于this answer

答案 2 :(得分:5)

您也可以尝试这样的事情:

select * from mytable where printf("%d", field1) = field1;

如果您的列是文本并且包含数字和字符串,这在提取整数数据方面可能会有所帮助。

示例:

CREATE TABLE mytable (field1 text);
insert into mytable values (1);
insert into mytable values ('a');

select * from mytable where printf("%d", field1) = field1;
field1
----------
1

答案 3 :(得分:3)

SELECT * 
FROM mytable
WHERE columnNumeric  GLOB '*[0-9]*'

答案 4 :(得分:1)

要测试该列是否包含排他且没有其他字母数字字符的整数,请使用:

NOT myColumn GLOB '*[^0-9]*' AND myColumn LIKE '_%'

即,我们测试该列是否包含数字以外的任何内容,然后将结果取反。另外,我们测试它是否包含至少一个字符。

请注意,GLOB '*[0-9]*'还将找到嵌套在其他字符之间的数字。函数typeof()将为列为TEXT的列返回'text',即使文本代表数字。如@rayzinnz所述,abs()函数也不可靠。

答案 5 :(得分:0)

您可以将函数CAST( field as INTEGER)的结果用于大于零的数字,以及每个数字等于零的简单条件(如“ 0”)

SELECT *
FROM tableName
WHERE CAST(fieldName AS INTEGER) > 0
UNION
SELECT *
FROM tableName
WHERE fieldName like '0';

答案 6 :(得分:0)

对于整数字符串,测试往返CAST是否与原始字符串匹配:

SELECT * FROM mytable WHERE cast(cast(mycolumn AS INTEGER) AS TEXT) = mycolumn

对于格式一致的真实字符串(例如,货币):

SELECT * FROM mytable WHERE printf("%.2f", cast(mycolumn AS REAL)) = mycolumn

输入值:

  • 不能有前导零
  • 必须将底片的格式设置为-number,而不是(number)

答案 7 :(得分:0)

SQLite和MySQL遵循相同的语法和宽松的数据类型。

下面的查询也是可能的

SELECT 
   <data>
 , (
     LENGTH(CAST(<data> AS UNSIGNED))
   )
     =
  CASE WHEN CAST(<data> AS UNSIGNED) = 0
  THEN CAST(<data> AS UNSIGNED)
  ELSE (LENGTH(<data>)
  ) END AS is_int;

请注意,<data>是BNF,您可以替换这些值。

此答案基于我的其他answer

运行SQLite demo

答案 8 :(得分:0)

意外地发现了这一点。您可以检查CAST值是否相等。

CASE   !!Varchar_Field!!
    WHEN CAST(!!Varchar_Field!! AS INTEGER) THEN 'Number'
    ELSE                                         'Character'
END

OR

CASE   
    WHEN --Varchar_Field-- = CAST(--Varchar_Field-- AS INTEGER) THEN 'Number'
    ELSE                                                             'Character'
END

同一件事,只是语法不同。