0

我用太极数据。无法访问函数、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

我怎样才能做到这一点?

4

4 回答 4

3

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

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;
于 2013-10-31T15:56:36.777 回答
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。

于 2013-11-01T11:05:59.607 回答
2
SELECT colname
,CHARACTERS(TRIM(colname)) -CHARACTERS(TRIM(OREPLACE(colname,',',''))) +1
 SAMPLE 100  FROM tablename
于 2013-12-16T14:51:50.147 回答
1

可以使用更简单有效的一行代码,如下所示:

select length(trim(regexp_replace(Column_Name,'[^,]+','')));
于 2018-03-30T10:25:20.470 回答