Oracle中单引号与双引号的使用及动态拼接_oracle拼接单引号-程序员宅基地

技术标签: oracle  数据库  ORACLE  

1.单引号

   单引号在Oracle中主要有两种作用,一是引用字符串,二是转义。

   栗子:

  • 引用字符串:
SELECT 'string' FROM DUAL 
  • 转义单引号本身:
SELECT '''' FROM DUAL

此语句结果为单引号本身。如果写作

select ''' from dual 

则会报错:

注意单引号转义时,两个单引号是相连的,中间没有空格间隔,在

select '''' from dual

语句中,两端口两个单引号是正常的字符串引用,中间两个紧密相连的单引号,第一个为转义字符,第二个为要转义的单引号本身,再比如

select '''''' from dual

语句,同样,两端是引用字符串的单引号,内部四个单引号,第二个单引号转义第三个单引号本身,第三个单引号转义第四个单引号本身,查询结果即为两个单引号:

进行转义时单引号之间有空格报错:

select '' '' from dual

如果觉得转义会出错,也可以直接使用单引号的ASSII码 CHR(39)来表示。比如查询两个单引号:

SELECT CHR(39)||CHR(39) FROM DUAL;

当然,在动态语句中想要使用单引号本身,也可以直接以CHR(39)代替。比如有以下拼接语句:

' AND A.COLUMN1 = 1 AND A.COLUMN2 = ' ||''''|| VARCHAR2_VALUE||'''';

以上语句中,假设变量VARCHAR2_VALUE是一个字符串变量,此时这个动态拼接语句中就不能直接使用下列语句:

' AND A.COLUMN1 = 1 AND A.COLUMN2 = ' ||VARCHAR2_VALUE;

上面语句中直接拼接字符串变量时,执行动态语句时,实际上varchar2_value变量值并没有被加上单引号,执行会报错,即执行语句类似:

AND A.COLUMN1 = 1 AND A.COLUMN2 = 字符变量值

因此,在动态变量拼接时,如果连接的一个变量或参数是字符型(尤其是含有非数值字符,比如字母)的值时,必须添加单引号,这时就需要使用转义或者直接使用CHR(39)代替想要转义的单引号:

' AND A.COLUMN1 = 1 AND A.COLUMN2 = ' ||CHR(39)|| VARCHAR2_VALUE||CHR(39);

当要拼接的字符类型变量全是数值时,字符会自动转型为数值,此时即时拼接时没有添加转义单引号,也不会报错,但严谨起见,这种情况还是最好都添加单引号。

总之,动态拼接时遵循以下要点:

   (1)最外边上的两个单引号是引用字符串的固定写法;

   (2)中间两个紧密相连的单引号表示单引号本身,例如:

''

第一个单引号表是转义字符,用来转义后面的字符;第二个单引号是被转义的字符。

   (3)中间不想转义的话直接用CHR(39)代替。

一个有点绕的拼接栗子:

想要获得执行的最终SQL

   SELECT T1.column1,
    T2.column2 ,
    T2.column3 ||
    '提示语句拼接前段'
    || T1.column1 ||' 提示语句拼接后段!'
    
    
   FROM 
   
   TABLE_T1 T1,
   TABLE_T2 T2
   ;

要动态拼接这种有多个明确分隔点的,可以按其分隔点单段拼接:

'
  
  SELECT T1.column1,
    T2.column2,
    T2.column3 ||
    '
    
    ||
    
    
    '''提示语句拼接前段'''
    
    ||
    
    '|| T1.column1 ||'
    
    ||
    
    '''提示语句拼接后段!'''
    
    || 'AS DESCRIPTION'
    
    ||
    '
     FROM 

   TABLE_T1 T1,
   TABLE_T2 T2
   '
;

以上拼接语句中,划分段为:

(1) ||连接符为目标语句中正常部分 ,因此划分到第一段,直接两内部不含单引号,直接两端单引号引用即可;
(2) 目标语句中含有单引号,需要转义:语句最两端单引号起引用作用,内部两端口的两个单引号第一个转义,第二个为被转义单引号本身;
(3) ||连接符为目标语句中正常部分,直接整体引用,注意拼接语句时只要不是非变量(输入或输出变量,或块中定义的变量),而是某个表的字段,则直接引用,不必再使用单独连接符;
(4) 同(2);
(5) 同(1);
(6) 同(1).

再来一个有点绕的拼接栗子:

目标语句:

 SELECT * FROM TEST_TABLE A  WHERE 
    INSTR(','||V_STRING||',' , ','||A.COLUMN1||',') > 0;

这里用到instr使用分隔符后连接后就有较多的单引号。实际拼接语句如下:

'SELECT * FROM TEST_TABLE A  WHERE
   INSTR('',''||'''
    ||  
    V_STRING
    ||
    '''||'','','',''||A.COLUMN1||'','') > 0';

以上语句中我们以V_STRING 变量为节点分段拼接:

(1) 第一段语句:两段单引号引用,注意||连接符是目标语句中应该包含的,注意到字符串变量在拼接时变量(表字段不需要处理)两端需要有单引号,比如:

SELECT INSTR(','||'1,2,5'||',' , ','||'1,2'||',') FROM DUAL;

因此实际拼接时注意V_STRING变量两边应有单引号,

INSTR(','||'

此内部语句中中含有三个单引号,要分别使用一个单引号转义(目标语句含单引号在拼接时在目标语句内部单引号基础上加一个单引号即可);


(2) V_STRING为字符串变量,两边使用||拼接;


(3) 第三段中同理,V_STRING右边也需要一个单引号:

'||',' , ','||A.COLUMN1||',') > 0

然后按拼接原则 ,两端加单引号,内部所有单引号再加一个单引号转义即可。

2. 双引号

   双引号在oracle中的使用作用比较单一,主要是按目标输出,并不触发oracle报错。

   (1) to_char输出日期时,包装非法字符,按预期正常输出:

select to_char(sysdate,'hh24"小时"mi"分"ss"秒"')  from dual;

   (2)其他查询输出目标形式:

SELECT 1 AS "税费(津贴+佣金)" FROM DUAL;

日常查询中,可能有时返回字段名称为中文,且包含一些ORACLE可以识别的特殊字符(+,- ,*,/ 括号(oracle对中英文括号同等识别)等),此时需要使用双引号才可以正常输出目标形式,否则会报错

SELECT 1 AS 税费(津贴+佣金) FROM DUAL;

另外,如果查询中出现使用中包含特殊字符的字段名称,比如临时查询字段名称为 税费(津贴+佣金),那么最好在查询时先行将这些特殊字符处理掉,(一般配合使用replace与translate函数去除)否则ORACLE也会对这些特殊字符进行识别,最终可能判别语法出现问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RogerFedererGO/article/details/135603911

智能推荐

美赛整理之投影寻踪模型及其求解-程序员宅基地

文章浏览阅读1.8w次,点赞61次,收藏317次。投影寻踪模型1.模型的简介和应用2.基本步骤:3.遗传算法求解模型的优化问题1.用MatlabMatlabMatlab的gagaga工具箱求解:2.遗传算法求解:3.LINGOLINGOLINGO工具箱求解1.模型的简介和应用投影寻踪是处理和分析高维数据的一类统计方法,其基本思想是将高维数据投影到低维(1~3维)子空间上,寻找出反映原高维数据的结构或特征的投影,以达到研究和分析高维数据的目的。1974年,美国Stanford大学的Friedman和Tukey首次将该方法命名为Projection Pur_投影寻踪模型

计算机应用 拒稿,论文投稿频繁被拒怎么办?985博士学长经验分析-程序员宅基地

文章浏览阅读1.7k次。原标题:论文投稿频繁被拒怎么办?985博士学长经验分析在现行科研体制之内,对于硕博生而言,如果没有发表论文你甚至就无法证明自己的存在,硕博生毕业、老师的晋升都需要论文的保驾护航。因此发表论文是科研学者的主要工作和主要目标。相信很多科研学者都会有论文投稿频繁被拒的经历,投稿被拒出内伤是常有之事,那么如何提高论文的命中率,听学长仔细道来。论文被拒可以先从三个方面思考一看自己论文质量是不是没有达到那个水..._计算机综述投稿一直不中

基于python的opencv项目实战P1_python opencv实验-程序员宅基地

文章浏览阅读691次。基于python的opencv项目实战 01-简介教程b站:https://b23.tv/av77390697/p1准备软件下载anaconda清华镜像网站(lenovo Anaconda3-2019.10-Windows-x86_64)官网安装opencv 下载.whl安装网址p.s.在prompt窗口进入anaconda的Scriptsd:#转到D盘cd sof..._python opencv实验

python发邮件--中文附件报错问题_server.sendmail 附件报错-程序员宅基地

文章浏览阅读784次。# -*- coding: utf-8 -*-"""Created on Thu Apr 11 14:01:30 2019@author: zhang-peng"""#coding: utf-8 import osimport sysimport smtplibfrom email.mime.text import MIMETextfrom email.mime.ima..._server.sendmail 附件报错

Servlet中模板引擎的使用_servletcontexttemplateresolver-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏2次。一.本机环境及模板引擎依赖因为使用模板引擎技术,需要在Maven中的pom.xml中引入thymeleaf依赖。我这里jdk使用的是1.8;模板引擎的依赖版本为3.1.0。如果开发环境相同,可以参考下面的依赖。在dependencs中添加下面依赖即可。 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.s_servletcontexttemplateresolver

leetcode 102——二叉树的层次遍历_leecode树层次遍历-程序员宅基地

文章浏览阅读100次。leetcode 102 —— 二叉树的层次遍历题目描述:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7],返回其层次遍历结果:[[3],[9,20],[15,7]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/bina..._leecode树层次遍历

随便推点

thinkphp5和php区别,thinkphp5.1和thinkphp5.0验证的区别-程序员宅基地

文章浏览阅读409次。最近在学习tp5.1,沿用5.0的代码发现不能触发验证,打开thinkphp5.1官方手册发现,原来的写法只能验证全部或者不验证全部规则,但是不能为去掉某个不需要的验证规则。以下是thinkphp5.0的验证规则,验证提示和验证场景写法:..._validate 5.0和5.1 不一样吗?

记一次磕磕绊绊的组建跨区卷过程_新建跨区卷-程序员宅基地

文章浏览阅读1.6k次。最近买了个地平线4,80多G,我这条500G的固态马上就容量告急了,于是下单了一块新的1T的固态。因为不喜欢分太多个分区,整个盘只分了系统(C盘)和软件(D盘)两个区,个人文件放在另一块机械盘里(E盘)。所以就想着把新的这块盘直接并到D盘上,组个跨区盘。然后就开始百度怎么组跨区盘。百度说要先转换成动态磁盘,于是就打开计算机管理——磁盘管理,选上两块盘点转换为动态磁盘。然后跳出提示“包名称无效”。遂再次百度,说是计算机名称要改成纯英文才能改。同时发现原来的500G盘里有个未知无用分区,估计是以前用Disk_新建跨区卷

Android基本控件和Activity的基本应用_android activity和控件-程序员宅基地

文章浏览阅读189次。Android基本控件和Activity的基本应用Android基本控件TextViewButtonAndroid基本控件TextView<TextViewandroid:id="@+id/name_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:gr..._android activity和控件

Java——聊聊JUC中的原子变量类_java原子变量-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。Java——聊聊JUC中的原子变量类_java原子变量

Java实现ftp文件上传工具类及踩过的坑_java ftps 工具类-程序员宅基地

文章浏览阅读834次。一、环境jdk1.8 + springboot2.3.2.RELEASE + commons-net-3.6.jar + commons-lang3-3.8.jar + commons-io-2.6.jar二、添加pom.xml文件依赖<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6<_java ftps 工具类

HTML5兼容手机-程序员宅基地

文章浏览阅读754次。web网站如何实现兼容手机一、总结一句话总结:加上这句话即可:<meta name=“viewport” content=“width=device-width,initial-scale=1.0”>。1、移动设备上的三个viewport是哪三个,分别代表什么?ppk把移动设备上的viewport分为layout viewport 、 visual viewport 和 ide..._html5兼容手机