SQL-запрос — ЛЕВЫЙ 1 = символ, ПРАВЫЙ 3–5 = числа в имени.

StackOverflow https://stackoverflow.com/questions/1417301

Вопрос

Мне нужно отфильтровать ненужные данные в таблице SQL (SQL Server 2008).Мне нужно идентифицировать эти записи и вытащить их.

  • Char[0] = A..Z, a..z
  • Символ[1] = 0..9
  • Символ[2] = 0..9
  • Символ[3] = 0..9
  • Символ[4] = 0..9

{Пробелы не допускаются}

В принципе, чистая запись будет выглядеть так:

  • Т1234, У2468, К123, П50054 (4 примера записи)

Ненужные данные выглядят так:

  • T12.., .T12, MARK, TP1, SP2, BFGL, BFPL (7 примеров записей)

Может ли кто-нибудь помочь с SQL-запросом, чтобы выполнить метод LEFT и RIGHT, извлечь эти символы и сделать LIKE IN или что-то в этом роде?

Хотя функция была бы отличной!

Это было полезно?

Решение

Следующее должно работать в нескольких разных системах:

SELECT * 
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'

Этот подход действительно будет соответствовать P2343, P23423JUNK и другому подобному тексту, но требует, чтобы формат был A0000*.

Теперь, если OP подразумевает, что формат 1-й позиции является символом, а все последующие позиции являются числовыми, как в A0+, тогда используйте следующее (в SQL Server и многих других системах баз данных):

SELECT *
FROM TheTable
WHERE SUBSTRING(Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(Data, 2, LEN(Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(Data) >= 5

Чтобы включить это в функцию SQL Server 2008, поскольку это, по-видимому, вам больше всего нужно, вы можете написать:

CREATE FUNCTION ufn_IsProperFormat(@data VARCHAR(50))
RETURNS BIT
AS
BEGIN
    RETURN 
     CASE 
      WHEN SUBSTRING(@Data, 1, 1) LIKE '[A-Za-z]'
        AND SUBSTRING(@Data, 2, LEN(@Data) - 1) NOT LIKE '%[^0-9]%'
        AND LEN(@Data) >= 5 THEN 1 
       ELSE 0 
      END
END

... и вызовите его так:

SELECT * 
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1

... этот запрос необходимо изменить для запросов Oracle, поскольку Oracle, похоже, не поддерживает обозначение скобок в предложениях LIKE:

SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}$')

Это расширение, которое gbn делает в своем ответе, но эти версии позволяют изменять длину строк без условий ИЛИ.

РЕДАКТИРОВАТЬ:Обновлено для поддержки примеров в SQL Server и Oracle для обеспечения формата A0+, чтобы A1324, A2342388 и P2342 соответствовали, а A2342JUNK и A234 — нет.

Код Oracle REGEXP_LIKE был заимствован из сообщения Марка, но обновлен для поддержки 4 или более числовых цифр.

Добавлен собственный подход SQL Server 2008, реализующий эти методы.

Другие советы

Зависит от вашей базы данных.Многие из них имеют функции регулярных выражений (обратите внимание, что примеры не проверены, поэтому проверьте)

напримерОракул

SELECT x
 FROM table
 WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}$')

Sybase использует LIKE

Учитывая, что в ваших примерах вы допускаете от 3 до 6 цифр для числа, вероятно, лучше использовать функцию ISNUMERIC() со второго символа и далее:

SELECT *
FROM TheTable
-- start with a letter
WHERE Data LIKE '[A-Za-z]%'
    -- everything from 2nd character onwards is a number
    AND ISNUMERIC( SUBSTRING( Data, 2, 50 ) ) = 1
    -- number doesn't have a decimal place
    AND Data NOT LIKE '%.%'

Для получения дополнительной информации см. ЦИФРОВОЙ функция в MSDN.

Также обратите внимание, что:

  • Я ограничил вторую часть максимум 50 символами, измените это в соответствии с вашими потребностями.
  • Строго говоря, вам следует проверить символы валюты и т. д., поскольку ISNUMERIC позволяет их использовать, а также +/- и некоторые другие.

Лучшим вариантом может быть создание функции, которая проверяет, что каждый символ после первого находится в диапазоне от 0 до 9 (или от 1 до 0, если вы используете коды ASCII).

Вы не можете использовать регулярные выражения в SQL Server, поэтому вам придется использовать ИЛИ.Исправление ответа Дэвида Андреса...

WHERE
    (
    Data LIKE '[A-Za-z][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9][0-9]'
    )

Ответ Дэвида позволяет "D1234junk" пройти

Вам также понадобится только «[A-Z]», если у вас нет чувствительности к регистру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top