2016-10-04 98 views
1

如何只選擇列的一部分?我知道我可以使用子字符串,但我需要選擇列的字符串部分。作爲一個例子:列可包含以下內容:MySQL只選擇列的一部分

DIRL100

我需要僅選擇在一列中DIRL部分,並且100部分作爲另一個。

這個特定列可以做到這一點,像這樣:

SELECT SUBSTRING(column, 5) AS part1, SUBSTRING(column, 1, 4) AS part2 ....

但我不能肯定它總是4個字母(二RL)它得到的數字前。可我以某種方式使用REGEXP或者只提取每列中的數字部分和字母部分?

換句話說..我可以拆分字母結束的列。它可以作爲示例包含DIRL100AB100200,它應該分成兩列,每列包含列(DIRL或AB)中的字母以及列中的數字(100或100200)?

+0

完全不瞭解您的問題,請您舉一些例子和預期的輸出? –

+0

(但我不能確定它總是4個字符(DIRL)在它變成數字之前)那麼你的分割條件是什麼? – Karthi

+0

分割條件是前綴結束時是字母。將更新問題 –

回答

1

試試這個請求:

SELECT LEFT(column, patindex('%[0-9]%', column)-1) AS Part1 
    , RIGHT(column, LEN(column) - patindex('%[0-9]%', column)+1) AS Part2 
+0

它適用於你的2個例子... – Francois

+0

這是sql服務器,問題是關於mysql。 patindex可以爲mysql創建,請參閱http://stackoverflow.com/questions/38315658/patindex-replacement-in-mysql – Kris

+0

Ooops ... MySQL錯過了! :) – Francois

0

不幸的是,在MySQL中的正則表達式的功能是有限的。你必須編寫一個自定義函數來幫助你。

DROP FUNCTION IF EXISTS get_index; 

DELIMITER $$ 
CREATE FUNCTION get_index(targetString VARCHAR(255)) RETURNS INTEGER 
BEGIN 

    DECLARE i INTEGER; 
    DECLARE min_index INTEGER; 
    DECLARE current_index INTEGER; 
    SET i = 0; 
    SET min_index = NULL; 

    loopNumbers: WHILE (i <= 9) DO 
     SET current_index = LOCATE(i, targetString); 
     IF current_index > 0 THEN 
      IF min_index IS NULL OR current_index < min_index THEN 
       SET min_index = current_index; 
      END IF; 
     END IF; 

     SET i = i + 1; 

    END WHILE; 

    RETURN(min_index); 

END 
$$ 
DELIMITER ; 

這個函數做的是獲得數字的第一個位置。然後,使用此功能,您可以修改您的查詢:

SELECT SUBSTRING(column_name FROM 1 FOR get_index(column_name)-1) AS first, SUBSTRING(column_name FROM get_index(column_name)) AS second 
FROM table_name 
WHERE column_name REGEXP '^[a-Z]+[0-9]+$' 

附加WHERE條件是可選的,以保證只有正確的格式數據被選擇。