是否允许使用LIKE作为NUMBER数据类型?

时间:2014-06-29 06:44:44

标签: sql oracle sql-like

有一个程序试图从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','-=-')

任何见解都会有很大的帮助!

3 个答案:

答案 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.