在DB2 9.7中,我正在寻找一种在SQL查询中反转字符串的方法。
我熟悉SQL Server,查询就像
SELECT
REVERSE(LEFT_TO_REIGHT) AS RIGHT_TO_LEFT
FROM
TABLE1;
我在DB2中找不到类似的功能。是否有一种简单的方法来反转字符串?
答案 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@