我有一个包含数字和其他字符串值的列(例如“?”,“???”等)
是否可以在SQLite中的where子句中添加“is number”条件?类似的东西:
select * from mytable where isnumber(mycolumn)
答案 0 :(得分:10)
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'
答案 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
同一件事,只是语法不同。