5

以下は私がテーブルに持っているものですmyTable

+++++++++++++++
+ id + myWord +
+++++++++++++++
+  1 + AB123  +
+  2 + A413D  +
+  3 + X5231  +
+  4 + ABE921 +
+++++++++++++++

実行すると

SELECT id, Locate('1',myWord) as myPos
FROM myTable;

1位を獲得。

+++++++++++++++
+ id + myPos  +
+++++++++++++++
+  1 + 3      +
+  2 + 3      +
+  3 + 5      +
+  4 + 6      +
+++++++++++++++

私が達成したいのは、以下の出力が得られるように整数の最初の位置を見つけることです。

+++++++++++++++++++++++
+ id + myWord + myPos +
+++++++++++++++++++++++
+  1 + AB123  +  3    +
+  2 + A413D  +  2    +
+  3 + X5231  +  2    +
+  4 + ABE921 +  4    +
+++++++++++++++++++++++

これを達成する方法はありますか?

4

3 に答える 3

7

xdazzの回答の助けを借りて、いくつかの変更を行い、最終的に回答を得ました...

SELECT 
  myWord, 
  LEAST (
    if (Locate('0',myWord) >0,Locate('0',myWord),999),
    if (Locate('1',myWord) >0,Locate('1',myWord),999),
    if (Locate('2',myWord) >0,Locate('2',myWord),999),
    if (Locate('3',myWord) >0,Locate('3',myWord),999),
    if (Locate('4',myWord) >0,Locate('4',myWord),999),
    if (Locate('5',myWord) >0,Locate('5',myWord),999),
    if (Locate('6',myWord) >0,Locate('6',myWord),999),
    if (Locate('7',myWord) >0,Locate('7',myWord),999),
    if (Locate('8',myWord) >0,Locate('8',myWord),999),
    if (Locate('9',myWord) >0,Locate('9',myWord),999)
  ) as myPos
FROM myTable;

デモ

于 2012-06-22T11:48:26.773 に答える
6

これを MySQL で頻繁に行う場合は、文字列関数SUBSTRING() および ASCII()を使用してストアド関数を作成することをお勧めします。

DELIMITER //;
CREATE FUNCTION find_first_int(pData CHAR(10))
  RETURNS INT
BEGIN
  DECLARE vPos INT DEFAULT 1;
  DECLARE vRes INT DEFAULT 0;
  DECLARE vChar INT;
  WHILE vPos <= LENGTH(pData) DO
    SET vChar = ASCII(SUBSTR(pData, vPos, 1));
    IF vChar BETWEEN 48 AND 57 THEN
      RETURN vPos;
    END IF;
    SET vPos = vPos + 1;
  END WHILE;
  RETURN NULL;
END//
DELIMITER ;//

結果:

mysql> SELECT id, myWord, find_first_int(myWord) AS myPos FROM t1;
+------+--------+-------+
| id   | myWord | myPos |
+------+--------+-------+
|    1 | AB123  |     3 |
|    2 | A413D  |     2 |
|    3 | X5231  |     2 |
|    4 | ABE921 |     4 |
|    5 | ABC    |  NULL |
+------+--------+-------+

NULL の結果は、関数IFNULL()を使用して変更できます。

この関数は CHAR(10) のみを受け入れるため、より長いデータの場合は変更することをお勧めします。

于 2012-06-21T11:39:51.573 に答える
3

スマートではありませんが、これは可能だと思います。

SELECT 
  id, 
  LEAST(
    Locate('0',myWord),
    Locate('1',myWord),
    Locate('2',myWord),
    Locate('3',myWord),
    Locate('4',myWord),
    Locate('5',myWord),
    Locate('6',myWord),
    Locate('7',myWord),
    Locate('8',myWord),
    Locate('9',myWord)
  ) as myPos
FROM myTable;
于 2012-06-21T09:48:47.453 に答える