Oracle中串连接符||的使用心得(个人见解)

    Oracle中可以用串连接符||将若干个串连在一起(Oracle中也可以使用concat函数,但是它只最多连接两个串。而MySQL中concat可以连接多个串。在SQL Server中则使用+进行串连接)。

    当然,这两个串可以是列名或字面值。例如:

select province || city from China;

    这样,查询出的结果就类似:“辽宁丹东”,将列或串连接起来中间是没有空格的。当然为了阅读起来更方便,可以利用逗号或空格将province和city列连接起来,形成类似“辽宁,丹东”的效果: select province || ',' || city from China;

    以上是比较正统的用法。

    ---------------------我是分割线----------------------------

    下面是我发现的旁门左道。

    最近写一个查询的时候,为了偷懒,想用一条语句来查询一个或多个列(当然,前提是这多个列的类型是一样的)中含有某一字符(即模糊查询)的记录。例如表T中有a、b、c、d四个列,想要将a、b、c中任意一个列或多个列中含有字符“x“的记录查出来,可以使用如下语句:

select * from T where a || b || c like '%x%';

    但个人感觉这种用法其实并不是太好,只是有时候可以偷偷懒^_^

    ||究竟是如何工作的不太理解,只有根据自己的实验得到一个猜想:

    像上面那个例子,应该是吧a、b、c三列的值连在了一起,然后查找‘%x%’这样的字符。换句话来说,如果某一条记录中abc三列的值分别为”rs“、”tx“、”yz“连在一起是”rstxyz“,而你的查询条件是'%xy%'(想查a、b、c中一个列或多个列是否含有”xy“)。本来是没有的,但是像类似上面例子那样使用的话,就会查到有这样的记录。这点我是试过的,的确会出现这样的情况。

    当然,上面的情况也可以避免,可以在连接符||中间加上一些分隔标志,这些分隔标志必须是列中不存在的,如”,“,即 select * from T where a || ',' || b || ',' || c like '%xy%';

    同时,这种用法不适合条件是”=“的精确查询,因为a、b、c三列的值连在了一起会成为”rstxyz“,如果使用如下语句: select * from T where a || b || c = 'rstxyz';

    就相当于在”rstxyz“中查找(而不是在a、b、c的一个或多个列中查找)。这样,本来在a、b、c中一列或多列中没有含有”rstxyz“,但是用上面的语句却可以查询出记录。而如果使用这样的语句 select * from T where a || b || c = 'tx';

    按本意来说的话是应该查询到记录的,但是上面的语句却无法查询出来。

    总之,这样的用法有偷工减料的嫌疑,还是少用为好。

 

你可能感兴趣的:(Oracle)