2013-10-31 31 views
0

我使用teradata。没有的功能的访问,UDF的,存储过程如何计算字符串中逗号的数量?

id attribute 
1 strength, power 
2 ring, wig, puff 
3 strength, ring 
4 puff, wig 
5 power 

我需要计算属性

id att_number 
1 2 
2 3 
3 2 
4 2 
5 1 

我如何能做到这一点的数量?

+0

? 14.0或13.0或更高版本 – 2013-10-31 15:10:38

+0

它是13.我没有翻译,替换等 –

+0

您的数据是否具有确定性的上限。逗号礼物? – 2013-10-31 15:44:28

回答

3

当然,您的网站应该至少安装oTranslate和oReplace UDF。然后,它是一个简单的

CHAR_LENGTH(col) - CHAR_LENGTH(OTRANSLATE(col, ',','')) 

没有这些功能,它在<insert your favourite body part here>痛。只需尝试在没有oREPLACE的情况下实施REPLACE,复杂的SQL会带来可怕的性能。

在你的情况下,它更容易一点。如果最大数量为12,则最有效的方式将是直线:

CASE 
    WHEN col LIKE '%,%,%,%,%,%,%,%,%,%,%,%,%' THEN 12 
    WHEN col LIKE '%,%,%,%,%,%,%,%,%,%,%,%' THEN 11 
    WHEN col LIKE '%,%,%,%,%,%,%,%,%,%,%'  THEN 10 
    WHEN col LIKE '%,%,%,%,%,%,%,%,%,%'  THEN 9 
    WHEN col LIKE '%,%,%,%,%,%,%,%,%'   THEN 8 
    WHEN col LIKE '%,%,%,%,%,%,%,%'   THEN 7 
    WHEN col LIKE '%,%,%,%,%,%,%'    THEN 6 
    WHEN col LIKE '%,%,%,%,%,%'    THEN 5 
    WHEN col LIKE '%,%,%,%,%'     THEN 4 
    WHEN col LIKE '%,%,%,%'     THEN 3 
    WHEN col LIKE '%,%,%'      THEN 2 
    WHEN col LIKE '%,%'      THEN 1 
    ELSE           0 
END 

无需嵌套CASE/POSITION/SUBSTRING。

3

仅使用indexsubstring函数,您需要一个嵌套case语句来检查最多12个属性,如下所示。您需要进一步嵌套case语句以计算最多12个属性,目前它只能计数到最多2个属性。 [note:mytext = attributes]

SELECT id, mytext 
,case 
when index(mytext, ',')= 0 then 0 
when index(mytext, ',')>0 then 
            case 
            when index(substring(mytext, index(mytext, ','), length(mytext)), ',')=0 then 1 
            when index(substring(mytext, index(mytext, ','), length(mytext)), ',')>0 then 2 
            end 
end 
from mydb.sd_test 
order by id; 
2

SELECT colname的 ,字符(TRIM(colname的))-CHARACTERS(TRIM(OREPLACE(colname的, '', '')))的Teradata的版本是您使用+1 样品100 FROM表名