字符串操作不是SQL表达式的拿手好戏。
但是这样的事情应该这样做:
SELECT
IF(CHAR_LENGTH(GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|')) < 130
, GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|')
, SUBSTRING_INDEX(
SUBSTR(GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|') ,1,130)
, '|'
, CHAR_LENGTH( SUBSTR(GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|') ,1,130) )
-CHAR_LENGTH(REPLACE(SUBSTR(GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|') ,1,130),'|',''))
)
)
这是相当复杂的。如果我们用占位符替换GROUP_CONCAT
表达式,将更容易解密。我们有res
代表GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|')
表达式。
SELECT
IF(CHAR_LENGTH(res) < 130
, res
, SUBSTRING_INDEX(
SUBSTR(res ,1,130)
, '|'
, CHAR_LENGTH( SUBSTR(res ,1,130) )
-CHAR_LENGTH(REPLACE(SUBSTR(res ,1,130),'|',''))
)
)
仍然丑陋,但更好。让我们来分解一下。
如果res
中的字符数小于130,我们就完成了。只需返回水库。
否则,我们需要将res修剪为130个字符,我们可以使用SUBSTRING函数来做到这一点。
现在,我们要修剪最后的|
及以下字符。要做到这一点,我们可以得到数字|
分隔符字符。然后我们知道最后一个是哪一个。我们可以通过用空字符串替换所有分隔字符,然后获取该字符串的长度,并从原始字符串的长度中减去该字符串的长度来计算分隔符字符的计数,其差值是拆下的分隔符。
然后我们可以使用差异在SUBSTRING_INDEX
函数的最后一个分隔符之前返回所有的字符。
这不是一个漂亮的解决方案,但它确实实现满足算法规格
结果不是长度相同 –
为什么你需要这个? – Strawberry
我需要插入结果的最大长度为190个字符,如果这还不够,请在下一个字段中插入接下来的190个字符等等 –