簡體   English   中英

MySQL - 根據行替換字符串的一部分

[英]MySQL - Replacing Portion of String Based on Rows

所以我有一張桌子。 為了簡化,我會說它有namecategory列。

一些例子:

name            category
Juice: Apple    3
Beer: Miller    4   
Cat Food        9
Juice           0
Beer: Molson    4
Juice: Orange   3
Dog Food        9
Beer            0

我想做的是格式化一個查詢,該查詢將找到所有category = 0 ,然后從其他結果中刪除那些后跟冒號的名稱(如果它們包含它們)。 見下文:

name            category
Apple           3    <- Instead of Juice: Apple
Miller          4    <- Instead of Beer: Miller
Cat Food        9
Juice           0
Molson          4    <- Instead of Beer: Molson
Orange          3    <- Instead of Juice: Orange
Dog Food        9
Beer            0

這可能嗎?

謝謝!

編輯:我發現以下工作 - 這是一個壞方法嗎?

SELECT
    category,
    REGEXP_REPLACE(
        name,
        CONCAT( '(', ( SELECT GROUP_CONCAT(  name SEPARATOR '|' ) FROM items WHERE category = 0 ), '): ' ),
        ''
    ) AS name
FROM
    tablename;

使用表的自LEFT連接和CASE表達式:

SELECT CASE 
         WHEN t2.name IS NULL THEN t1.name
         ELSE SUBSTRING_INDEX(t1.name, ': ', -1)
       END name,
       t1.category
FROM tablename t1 LEFT JOIN tablename t2
ON t1.name LIKE CONCAT(t2.name, ':%') AND t2.category = 0

或存在:

SELECT CASE 
         WHEN EXISTS(SELECT 1 FROM tablename t2 WHERE t1.name LIKE CONCAT(t2.name, ':%') AND t2.category = 0)
           THEN SUBSTRING_INDEX(t1.name, ': ', -1)
         ELSE t1.name
       END name,
       t1.category
FROM tablename t1 

演示
結果:

> name     | category
> :------- | -------:
> Apple    |        3
> Miller   |        4
> Cat Food |        9
> Juice    |        0
> Molson   |        4
> Orange   |        3
> Dog Food |        9
> Beer     |        0

如果我沒有誤解,這樣的事情不會起作用嗎?

SELECT
    SUBSTRING_INDEX(tablename.name, ': ', -1) as name,
    `tablename`.`category`
FROM
    `tablename`

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM