oracle 查询条件带单引号

2019-05-07 15:55:15 qq_39482010 阅读数 1167

转:https://blog.csdn.net/learning_oracle_lh/article/details/46639507
ORACLE单引号转义:

**在ORACLE中,单引号有两个作用:
1:字符串是由单引号引用
2:转义。
单引号的使用是就近配对,即就近原则。而在单引号充当转义角色时相对不好理解
1.从第二个单引号开始被视为转义符,如果第二个单引号后面还有单引号(哪怕只有一个)。
SQL> select ‘’’’ result from dual;
RESULT


第二个单引号被作为转义符,第三个单引号被转义,可将sql写成这样更好理解:
select ’ ‘’ ’ from dual;
output:’
//
2.连接符‘||’导致了新一轮的转义:
连接符号‘||’左右的单引号没有任何的关系,
除非‘||’是作为字符串的一部分(这在动态SQL中很常见)。
SQL> select ‘name’||’’’’ result from dual;
RESULT

name’
理解:||后面的作为一个字符串,即前后是’,中间又是一个密集型单引号串’’,因此第一个为转义功能.
SQL> select ‘name’’’’’ result from dual;
RESULT

name’’
第一个和最后一个单引号作为字符串引用符,中间四个单引号两两转义.
//
oracle中使用双引号:
1)一般来说,字符串中的双引号仅仅被当作一个普通字符进行处理。
此时,双引号不需要成对出现:
SQL> select ‘hh24"小时"“mi”“分”"“ss"秒”’ results from dual;
RESULTS

hh24"小时"“mi”“分”"“ss"秒”
//
2)当出现在to_char的格式字符串中时,双引号有特殊的作用,
就是将非法的格式符包装起来,避免出现ORA-01821: date format not recognized错误。
也就是说,去掉双引号和其包含的字符后,剩下的应该是一个合法的格式串。
to_char在处理格式字符串时,会忽略双引号:
SQL> select to_char(sysdate,‘hh24"小时"mi"分"ss"秒"’) results from dual;
RESULTS

06小时39分51秒
//
格式串为’hh24"小时"mi"分"ss"秒"’;
去掉双引号部分后,剩下的是’hh24miss’,是一个合法的格式串。
不过即使真不知道双引号的这个用法,也可以这样来处理,虽然麻烦一点:
select to_char(sysdate, ‘hh24’) || ‘小时’ ||
to_char(sysdate, ‘mi’) || ‘分’ ||
to_char(sysdate, ‘ss’) || ‘秒’
AS RESULT
from dual;
RESULT

06小时40分18秒
例子
create table t_test1(str_sql varchar2(2000));
create table t_test2(str_sql varchar2(2000),cnt number(10));
truncate table t_test1;
truncate table t_test2;
insert into t_test1 select table_name from user_tables;
commit;

set serveropput on;
declare
vv_name varchar2(200):=’’;
vv_cnt number(10):=0;
vv_sql varchar2(2000):=’’;
begin
for usr in (select str_sql from t_test1)
loop
vv_sql := rtrim(‘insert into t_test2 SELECT ‘’’||usr.str_sql|| ‘’’,COUNT(1) FROM ’ || usr.str_sql,’;’);
dbms_output.put_line(vv_sql);
execute immediate vv_sql;
commit;
end loop;
commit;
end;
vv_sql := rtrim(‘insert into t_test2 SELECT ‘’’||usr.str_sql|| ‘’’,COUNT(1) FROM ’ || usr.str_sql,’;’);
rtrim(a,b):
从右边删除a字符串的b字符串;
以上例子即为:删除 ‘insert into t_test2 SELECT ‘’’||usr.str_sql|| ‘’’,COUNT(1) FROM ’ || usr.str_sql 字符串中的 ;
‘insert into t_test2 SELECT ‘’’||usr.str_sql|| ‘’’,COUNT(1) FROM ’ || usr.str_sql
'insert into t_test2 SELECT ‘’'

1 234
==> 单引号之中是 insert into t_test2 SELECT ’
其中第1、4个单引号是代表里面是字符串,第2个单引号是转义字符,第3个单引号就是想要输出的单引号;
|| --连接字符串
usr.str_sql
|| --连接字符串
‘’’,COUNT(1) FROM ’
123 4
第1、4个单引号是代表里面是字符串,第2个单引号是转义字符,第3个单引号就是想要输出的单引号;
==> ',COUNT(1) FROM
|| --连接字符串
usr.str_sql
故以上语句等价于
==> insert into t_test2 SELECT ‘usr.str_sql’,COUNT(1) FROM usr.str_sql

2019-01-10 11:04:11 xk851061358 阅读数 2247
// 查询字段中含有单引号的数据 **单引号chr(39),双引号(34)**
select * from test_tb where test_col like '%'||chr(39)||'%';
// 修改字段中首位含有单引号的数据
update test_tb set test_col=substr(test_col,2,length(test_col)) where id='****';

其他字符ASCII码对应表

chr(9) tab空格       chr(10) 换行      chr(13) 回车        Chr(13)&chr(10) 回车换行       chr(32) 空格符       chr(34) 双引号       chr(39) 单引号
chr(33) !        chr(34) "        chr(35) #        chr(36) $        chr(37) %        chr(38) &        chr(39) '        chr(40) (        chr(41) )        chr(42) *
chr(43) +        chr(44) ,        chr(45) -        chr(46) .        chr(47) /

Chr(48) 0        Chr(49) 1        Chr(50) 2        Chr(51) 3        Chr(52) 4        Chr(53) 5        Chr(54) 6        Chr(55) 7        Chr(56) 8        Chr(57) 9
chr(58)            chr(59) ;        chr(60) <        chr(61) =        chr(62) >        chr(63) ?        chr(64) @

chr(65) A        chr(66) B        chr(67) C        chr(68) D        chr(69) E        chr(70) F        chr(71) G        chr(72) H         chr(73) I          chr(74) J
chr(75) K        chr(76) L        chr(77) M        chr(78) N        chr(79) O        chr(80) P        chr(81) Q        chr(82) R        chr(83) S        chr(84) T
chr(85) U        chr(86) V        chr(87) W        chr(88) X        chr(89) Y        chr(90) Z

chr(91) [        chr(92) \        chr(93) ]        chr(94) ^        chr(95) _        chr(96) `

chr(97) a        chr(98) b        chr(99) c        chr(100) d        chr(101) e       chr(102) f       chr(103) g       chr(104) h        chr(105) i
chr(106) j        chr(107) k       chr(108) l        chr(109) m       chr(110) n       chr(111) o       chr(112) p        chr(113) q       chr(114) r
chr(115) s       chr(116) t        chr(117) u       chr(118) v       chr(119) w       chr(120) x        chr(121) y       chr(122) z

chr(123) {       chr(124) |       chr(125) }       chr(126) ~        chr(127)          chr(128)         chr(153)™        chr(169) ©          chr(174) ®
2018-07-05 10:36:38 zxf261 阅读数 2639

方法一

select * from tab where col like '%'||chr(39)||'%';


方法二

select * from tab where col like '%''%';



2019-01-25 20:05:53 weixin_44600908 阅读数 1007

Oracle中要查询或新增的字符串中含有单引号的处理


oracle字符串使用单引号引起来的,所以如果要插入的或者是查询的数据中含有单引号就需要转义才可以
正常工作,下面含有写出的是两种转义方式:

  1. 最简单的一种方式就是在需要转义的单引号前面再加上一个单引号。
INSERT INTO TEST_TABLE(MONTHFUND_ID, SUBMIT_PERSON) VALUES ('000101', 'to_date(submit_date, ''yyyy-MM'')');

在上面的一条sql语句中想要添加到字段SUBMIT_PERSON中的值是to_date(submit_date, ‘yyyy-MM’),该值就是含有单引号的,可以在单引号的地方再加上一个单引号即可。

  1. 第二种方式是在含有单引号的字符串前面以q或Q开头,后面是字符串的内容(该字符串可以包含单引号),不过需要遵守一定的格式,也就是该字符串是需要包含在[、<、(、{之间,前面四中是左侧的,右侧的与其对应即可。比如上面使用两个单引号新增数据的例子按照第二种方式来写就是:
INSERT INTO TEST_TABLE(MONTHFUND_ID, SUBMIT_PERSON) VALUES ('000102', Q'[to_date(submit_date, 'yyyy-MM')]');
INSERT INTO TEST_TABLE(MONTHFUND_ID, SUBMIT_PERSON) VALUES ('000103', Q'<to_date(submit_date, 'yyyy-MM')>');
INSERT INTO TEST_TABLE(MONTHFUND_ID, SUBMIT_PERSON) VALUES ('000104', Q'(to_date(submit_date, 'yyyy-MM'))');
INSERT INTO TEST_TABLE(MONTHFUND_ID, SUBMIT_PERSON) VALUES ('000105', Q'{to_date(submit_date, 'yyyy-MM')}');

对于查询也是使用同样的方法。

2019-08-12 22:00:36 weixin_43171988 阅读数 918
/*A.首尾单引号为字符串识别标识,不做转译用*/
select ''||to_char('CRUDBOY')||'' from dual;--CRUDBOY
/*B.首尾单引号里面如果出现的单引号,并且有多个,则相连两个单引号转译为一个字符串单引号*/
select '''' || to_char('CRUDBOY') || '''' from dual;--'CRUDBOY'
select '''''' || to_char('CRUDBOY') || '''''' from dual;--''CRUDBOY''
select '''''''' || to_char('CRUDBOY') || '''''''' from dual;--'''CRUDBOY'''
/*C.单引号一定成对出现,否者这个字符串出错,因为字符串不知道哪个单引号负责结束*/
select ' '' ' ||' ' || ' '' ' || to_char('CRUDBOY')||' '' ' ||' ' || ' '' '  from dual;-- '   ' CRUDBOY ' ' 
select ' '' ' ||' ' || ' '' ' || to_char('CRUDBOY') from dual;-- '   ' CRUDBOY
/*''';'同时满足A.B*/
select ' '' ' ||' ' || ' '' ' || to_char('CRUDBOY')||''';' from dual;-- '   ' CRUDBOY';

oracle语句拼接应该记住的三点,同时应该灵活运用/*''';'同时满足A.B*/ select ' '' ' ||' ' || ' '' ' || to_char('CRUDBOY')||''';' from dual;-- ' ' CRUDBOY';转译与标识的完美结合,二者同时存在。
写在最后
纸上得来终觉浅,绝知此事要躬行