有一个程序试图从PROJECTS表中获取项目的详细信息。 片段在这里:
PROCEDURE GET_PROJECTS (
P_PROJECT_ID_LIKE IN VARCHAR2 DEFAULT '%',
P_SEPARATOR IN VARCHAR2 DEFAULT '-=-' )
AS
CURSOR PROJECTS_CURSOR IS
.....
WHERE
PROJECT_ID LIKE P_PROJECT_ID_LIKE
关注点是:
PROJECT_ID has a datatype - NUMBER.
P_PROJECT_ID_LIKE has a datatype - VARCHAR2.
我想知道如何在PROJECT_ID上使用LIKE?
的效果非常好
GET_PROJECTS('%','-=-');
GET_PROJECTS('28','-=-')
任何见解都会有很大的帮助!
答案 0 :(得分:1)
将进行隐式类型转换。请注意谓词信息部分中的1 - filter(TO_CHAR("N") LIKE 'asdf%')
。
15:13:51 (133)LKU@sandbox> create table t (n number);
Table created.
Elapsed: 00:00:00.10
15:14:22 (133)LKU@sandbox> select * from t where n like 'asdf%'
15:14:37 2
15:14:37 (133)LKU@sandbox> @xplan
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 13 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_CHAR("N") LIKE 'asdf%')
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "N"[NUMBER,22]
在任何一种情况下,使用like
运算符过滤标识符都没有多大意义。如果你想在满足某些条件的情况下获得所有值,那么你应该这样做:
where project_id = P_PROJECT_ID or P_PROJECT_ID = -1
基本上使用任何非有效项目ID的数值。
答案 1 :(得分:0)
由于@be现在建议进行隐式转换。这将在99%的时间内起作用,但是在达到大数字时会有一些注意事项。
以此方案为例,
SQL> select to_char(power(2,140)) from dual;
TO_CHAR(POWER(2,140))
----------------------------------------
1.3937965749081639463459823920405226E+42
使用指数表示法将数字转换为char。所以某些字符串可能不匹配。
如果你没有达到这些数字,你应该没事。
虽然这是一个oracle问题,但请从Zen Of Python
中获取一些建议明确比隐含更好。
答案 2 :(得分:-3)
我在Oracle中没有检查过这个问题但是在SQL Server中可以使用类似于INT的属性,
例如
Create table mytable(
id int not null ,
name varchar(50))
然后您可以选择类似
select * from mytable where id like '123%'
可能的原因是char是Integral类型。
so in my conclusion ,this might be possible in oracle too please check.