当查询不应该遇到问题条目时,我的查询格式导致数据转换错误
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;
我们甚至可以改进上述查询,例如通过找到一种方法来消除子查询。但更好的方法是停止在同一列中混合数字和文本数据。如果您需要 int1
和 int2
作为整数列,则将它们设置为 INT
并且只在其中存储整数数据。
我可能对查询的工作方式有误解。我有一个 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;
我们甚至可以改进上述查询,例如通过找到一种方法来消除子查询。但更好的方法是停止在同一列中混合数字和文本数据。如果您需要 int1
和 int2
作为整数列,则将它们设置为 INT
并且只在其中存储整数数据。