2017-05-31 32 views
1

我有一个子查询:如何从MySQL选择修剪不完整的结果

SELECT SUBSTRING(
     (SELECT GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|') 
     FROM darwin.vt_partidas PT 
     WHERE PT.Pedimento = P.ID) 
     ,1,30) AS 'Resultado' 
FROM darwin.vt_pedimentos P WHERE P.ID=130 

我需要Concat的分离与所有结果|直到我达到130个字符,但我的问题是,如果最后结果不适合的例子:

我得到的前30个字符,但最后的结果不适合,我得到︰ result1 | result2 | result3 |导致

,我想这一点: RESULT1 | RESULT2 | result3

(如果结果不符合,请从这一结果中的所有字符)

谢谢你们

+0

结果不是长度相同 –

+0

为什么你需要这个? – Strawberry

+0

我需要插入结果的最大长度为190个字符,如果这还不够,请在下一个字段中插入接下来的190个字符等等 –

回答

0

尝试这

更新您的GROUP_CONCAT并添加另一个步骤,以去除不相关的数据超过30最大长度

SELECT 
    @str:= left(GROUP_CONCAT(DISTINCT PT.Factura SEPARATOR '|'), 30) 
FROM 
    vt_pedimentos P 
    INNER JOIN 
     vt_partidas PT 
     ON PT.Pedimento = P.ID 
WHERE 
    P.ID = 130; 


-- to check whether the last or truncated text exists in the table otherwise remove 
select 
    @str:= left(@str, 
    (
     length(@str) - length(reverse(left(reverse(@str), locate('|', reverse(@str)) - 1))) 
    ) 
    - 1) 
FROM 
    vt_pedimentos P 
where 
    NOT EXISTS 
    (
     select 
     1 
     from 
     vt_partidas PT 
     where 
     PT.Factura = reverse(left(reverse(@str), locate('|', reverse(@str)) - 1)) 
    ) 
    and P.ID = 130; 

进一步增强 - 它有一个SQL语句

0

字符串操作不是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函数的最后一个分隔符之前返回所有的字符。

这不是一个漂亮的解决方案,但它确实实现满足算法规格