当查询不应该遇到问题条目时,我的查询格式导致数据转换错误

The Format of my Query Causes a Data Conversion Error When the Query Should Never Encounter the Problem Entry

我可能对查询的工作方式有误解。我有一个 table,其中包含 3 列(id、int1、int2),我对此很感兴趣。int1 和 int2 可以包含正整数或“-”字符。由于我无法控制的原因,我无法更改格式并更改“-”来表示整数。以下是我的查询。

CREATE TABLE table1 AS (SELECT id, int1, int2 FROM CSVREAD(someCSV));

SELECT count(id)
FROM (SELECT id, int1, int2
      FROM table1
      WHERE int1 NOT LIKE '-' AND int2 NOT LIKE '-')
WHERE int1 > 100 AND int2 > 100;

根据我的理解,外部查询应该使用子查询的结果,这意味着外部查询不应该看到任何“-”但是当我尝试运行这个时,我得到以下错误

Data conversion error converting "-";

我可以通过使用 case 语句来解决问题,但我想知道为什么这不像我想象的那样有效。

编辑: 我意识到这听起来像一列可以在整数之间有“-”。该条目实际上要么有“-”,要么有一个整数,而不是两者的组合。我在代码片段中添加了 table 的创建。

示例table(这也是csv的格式)

|---------|----------|--------|
|    id   |   int1   |  int2  |
|---------|----------|--------|
|    1    |   34     |  120   |
|---------|----------|--------|
|    2    |   -      |  -     |
|---------|----------|--------|
|    3    |   200    |  200   |
|---------|----------|--------|
|    4    |   15     |  90    |
|---------|----------|--------|
|    5    |   130    |  145   |
|---------|----------|--------|

子查询returns所有只有整数的行

错误可能发生在外部 WHERE 子句中:

WHERE int1 > 100 AND int2 > 100

当它命中 int1 and/or int2 的值时,其中有破折号。这种情况正在发生,也许与您的想法相反,因为您的 LIKE 表达式是错误的。要在列中的任意位置检查破折号 ,您应该使用如下内容:

WHERE int1 NOT LIKE '%-%'

这是您更正的查询:

SELECT COUNT(*)
FROM
(
    SELECT id, int1, int2
    FROM table1
    WHERE int1 NOT LIKE '%-%' AND int2 NOT LIKE '%-%'
) t
WHERE CAST(int1 AS INT) > 100 AND CAST(int2 AS INT) > 100;

我们甚至可以改进上述查询,例如通过找到一种方法来消除子查询。但更好的方法是停止在同一列中混合数字和文本数据。如果您需要 int1int2 作为整数列,则将它们设置为 INT 并且只在其中存储整数数据。