oracle sql在where子句中给予数字列表

z5btuh9x  于 2022-12-22  发布在  Oracle
关注(0)|答案(2)|浏览(129)

我正在看这个例子。这使得它看起来像单引号不需要在where子句当你给予一个数字列表。我使用oracle数据库,如果这有区别的话。
https://www.sqlservertutorial.net/sql-server-basics/sql-server-in/

SELECT
    product_name,
    list_price
FROM
    production.products
WHERE
    list_price IN (89.99, 109.99, 159.99)
ORDER BY
    list_price;

那么为什么我这样做的时候toad会抱怨呢?它会把无效的标识符作为错误消息。
这是失败的查询。

select * from table1 where id in (1, 2, 3, 4);

我这样做的时候,蟾蜍没有抱怨。

select * from table1 where id in ('1', '2', '3', '4');
fcg9iug3

fcg9iug31#

检查以确保您使用的是预期的数据类型。在我的情况下,我使用的是CHAR(12),这就是为什么我需要引号。

SELECT 
    COLUMN_NAME,
    DATA_TYPE,
    DATA_LENGTH,
    DATA_PRECISION,
    DATA_SCALE
FROM ALL_TAB_COLS
Where TABLE_NAME = 'table1';

如果这不起作用,你的表可能是大写字母,所以试试这个。

SELECT 
    COLUMN_NAME,
    DATA_TYPE,
    DATA_LENGTH,
    DATA_PRECISION,
    DATA_SCALE
FROM ALL_TAB_COLS
Where TABLE_NAME = upper('table1');
lndjwyie

lndjwyie2#

既然问题是关于获取不同的数字,那么让我们来看看一个简单的方法。
当然,如果该列总是只保存数字,而不允许使用字符串,那么我们应该只更改它的数据类型。
当然,如果我们只想检查几个数字,比如1、2和3,我们可以使用IN子句,就像问题中所示的那样。
但是让我们假设我们不能改变数据类型,因为字符串也可能出现,我们需要接受很大范围的数字。
例如,我们希望接受200到300之间的所有数字,但我们不喜欢编写包含101个值的IN子句,不是吗?
因此,我们可以使用VALIDATE_CONVERSION来确保只考虑数字项。
然后我们使用CAST AS INT来检查数字应该在200和300之间。
查询将是这样一个:

SELECT id
FROM table1
WHERE VALIDATE_CONVERSION(id AS NUMBER) = 1
AND CAST (id AS INT) BETWEEN 200 AND 300
ORDER BY id; -- sorting is of course not needed. Remove it if not intended.

我们可以在这里尝试一下:db<>fiddle

相关问题