MySQL полоса нечисловых символов для сравнения - PullRequest
30 голосов
/ 13 ноября 2008

Я ищу в таблице записи, которые соответствуют конкретному номеру, который вводит пользователь. Таким образом, пользователь может ввести 12345, но это может быть 123zz4-5 в базе данных.

Я полагаю, что что-то подобное будет работать, если бы функции PHP работали в MySQL.

SELECT * FROM foo WHERE preg_replace("/[^0-9]/","",bar) = '12345'

Какая эквивалентная функция или способ сделать это только с MySQL?

Ответы [ 13 ]

0 голосов
/ 03 августа 2017

попробуйте этот пример. это используется для телефонных номеров, однако вы можете изменить его для своих нужд.

   -- function removes non numberic characters from input
-- returne only the numbers in the string

CREATE DEFINER =`root`@`localhost` FUNCTION `remove_alpha`(inputPhoneNumber VARCHAR(50))
  RETURNS VARCHAR(50)
  CHARSET latin1
DETERMINISTIC
  BEGIN


    DECLARE inputLenght INT DEFAULT 0;
    -- var for our iteration 
    DECLARE counter INT DEFAULT 1;
    -- if null is passed, we still return an tempty string
    DECLARE sanitizedText VARCHAR(50) DEFAULT '';
    -- holder of each character during the iteration
    DECLARE oneChar VARCHAR(1) DEFAULT '';


    -- we'll process only if it is not null.
    IF NOT ISNULL(inputPhoneNumber)
    THEN
      SET inputLenght = LENGTH(inputPhoneNumber);
      WHILE counter <= inputLenght DO
        SET oneChar = SUBSTRING(inputPhoneNumber, counter, 1);
        IF (oneChar REGEXP ('^[0-9]+$'))
        THEN
          SET sanitizedText = Concat(sanitizedText, oneChar);
        END IF;

        SET counter = counter + 1;
      END WHILE;
    END IF;

    RETURN sanitizedText;
      END

для использования этой пользовательской функции (UDF). допустим, у вас есть столбец телефонных номеров:

col1
(513)983-3983
1-838-338-9898
phone983-889-8383

select remove_alpha(col1) from mytable

Результат будет;

5139833983
18383389898
9838898383
0 голосов
/ 13 ноября 2008

Насколько велика таблица с foo? Если оно мало и скорость действительно не имеет значения, вы можете потянуть идентификатор строки и foo, зациклить их, используя функции замены PHP, для сравнения, а затем получить нужную информацию по номеру строки.

Конечно, если стол слишком большой, это не сработает.

0 голосов
/ 13 ноября 2008

Насколько я могу судить, замены нет, но я нашел это решение;

--Create a table with numbers
DROP TABLE IF EXISTS ints;
CREATE TABLE ints (i INT UNSIGNED NOT NULL PRIMARY KEY);

INSERT INTO ints (i) VALUES
( 1), ( 2), ( 3), ( 4), ( 5), ( 6), ( 7), ( 8), ( 9), (10),
(11), (12), (13), (14), (15), (16), (17), (18), (19), (20);

--Then extract the numbers from the specified column
SELECT
    bar,
    GROUP_CONCAT(SUBSTRING(bar, i, 1) ORDER BY i SEPARATOR '')
FROM foo
JOIN ints ON i BETWEEN 1 AND LENGTH(bar)
WHERE
    SUBSTRING(bar, i, 1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
GROUP BY bar;

Это работает для меня, и я использую MySQL 5.0

Также я нашел это место , которое могло бы помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...