SQL中的字符串操作以反转字符串

时间:2014-11-27 13:15:40

标签: sql db2 reverse db2-luw

在DB2 9.7中,我正在寻找一种在SQL查询中反转字符串的方法。

我熟悉SQL Server,查询就像

SELECT
    REVERSE(LEFT_TO_REIGHT) AS RIGHT_TO_LEFT
FROM 
    TABLE1;

我在DB2中找不到类似的功能。是否有一种简单的方法来反转字符串?

4 个答案:

答案 0 :(得分:3)

不需要创建REVERSE(..)功能 DB2有一个名为RIGHT(string-expression, length)的东西:

  

RIGHT函数返回最右边的string-expression字符串   长度的长度,以指定的字符串单位表示。如果   string-expression是一个字符串,结果是一个字符   串。如果string-expression是图形字符串,则结果为a   图形字符串

因此,如果您对最后8个字符感兴趣,可以通过以下方式轻松完成:

SELECT RIGHT(left_to_right, 8) AS right_to_left
FROM Table1

(我实际上仍然担心你会持续分割掉8个字符,因为这意味着你有一个多部分的密钥)。

答案 1 :(得分:2)

尝试类似:

SELECT STRIP(CAST( TRANSLATE('87654321',LEFT_TO_REIGHT, '12345678') AS VARCHAR(8) ))                                   
FROM TABLE1;   

答案 2 :(得分:0)

回答原始的反转字符串问题,在IBM网站上发布了用户定义的函数,您可以在此处找到实现此功能的函数。 DB2中显然没有内置功能

https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/reverse?lang=en

折磨的SQL版本:

CREATE OR REPLACE FUNCTION REVERSE(INSTR VARCHAR(4000))
  RETURNS VARCHAR(4000) SPECIFIC REVERSE
   DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
 RETURN WITH rec(pos, res) AS (VALUES (1, CAST('' AS VARCHAR(4000)))
                               UNION ALL
                               SELECT pos + 1, SUBSTR(INSTR, pos , 1) || res 
                                 FROM rec 
                                 WHERE pos <= LENGTH(INSTR) 
                                   AND pos < 5000)
        SELECT res FROM rec WHERE pos > LENGTH(INSTR);

但是您也必须这样做,this:

CREATE BUFFERPOOL bp32 PAGESIZE 32K;

CREATE SYSTEM TEMPORARY TABLESPACE tsp32 PAGESIZE 32K BUFFERPOOL bp32;

更合理的C实现

#include <sqludf.h>

#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN ReverseSBCP(SQLUDF_VARCHAR  *inVarchar,
                            SQLUDF_VARCHAR  *outVarchar,
                            SQLUDF_SMALLINT *inVarcharNullInd,
                            SQLUDF_SMALLINT *outVarcharNullInd,
                            SQLUDF_TRAIL_ARGS)
{
  int inLen, inPos, outPos;

  if (*inVarcharNullInd == -1)
  {
    *outVarcharNullInd = -1;
  }
  else
  {
    inLen = strlen(inVarchar);
    for (inPos = 0, outPos = inLen -1; inPos < inLen; inPos++, outPos--)
    {   
      outVarchar[outPos] = inVarchar[inPos];
    }   
    outVarchar[inLen] = '\0'; 
    *outVarcharNullInd = 0;
  }
  return;
}

答案 3 :(得分:0)

由于原始问题,这是当人们搜索“如何在DB2中反转字符串”时出现的第一个网页。

这是一个不需要在C中实现它的答案,并且无论长度如何,都不应制动在非纯Engilsh字符串上。 但是请注意,效率充其量是“ meh”。

CREATE FUNCTION REVERSE_STRING(STR VARCHAR(100))
RETURNS VARCHAR(100)
LANGUAGE SQL
SPECIFIC REVERSE_STRING
DETERMINISTIC
REVERSE: BEGIN
DECLARE REVERSED_STRING VARCHAR(100);
DECLARE REVERSED_CHARACTERS_INDEX INTEGER;
SET REVERSED_STRING='';
SET REVERSED_CHARACTERS_INDEX=0;
WHILE (REVERSED_CHARACTERS_INDEX < CHARACTER_LENGTH(STR, CODEUNITS16))
DO
        SET REVERSED_CHARACTERS_INDEX = REVERSED_CHARACTERS_INDEX + 1;
        SET REVERSED_STRING = CONCAT(
            REVERSED_STRING,
            LEFT(RIGHT(STR, REVERSED_CHARACTERS_INDEX, CODEUNITS16), 1, CODEUNITS16));
END WHILE;
RETURN REVERSED_STRING;
END REVERSE@

这个想法是要得到一个从右边的第n个字符开始直到该字符串结尾的子字符串,然后从左边取该子字符串的第一个元素并将其附加到反向字符串。此操作执行n次,其中n是要反转的字符串的长度。

您可以像使用其他任何功能一样使用它。

SELECT FIRSTNME AS FIRSTNAME, REVERSE_STRING(FIRSTNME) AS REVERSED_FIRSTNAME
FROM SAMPLE.EMPLOYEE@

Example output