SQL-запрос - LEFT 1 = символ, RIGHT 3-5 = число в имени - PullRequest
1 голос
/ 13 сентября 2009

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

  • Char [0] = A..Z, a..z
  • Char [1] = 0,9
  • Char [2] = 0,9
  • Char [3] = 0,9
  • Char [4] = 0,9

{Пробелы запрещены}

По сути, чистая запись будет выглядеть так:

  • T1234, U2468, K123, P50054 (4 примера записи)

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

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

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

Хотя функция была бы великолепна!

Ответы [ 4 ]

4 голосов
/ 13 сентября 2009

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

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 делает в своем ответе, но эти версии допускают переменную длину строки без условий ИЛИ.

EDIT : Обновлено для поддержки примеров в SQL Server и Oracle для обеспечения формата A0 +, так что A1324, A2342388 и P2342 совпадают, а A2342JUNK и A234 - нет.

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

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

2 голосов
/ 13 сентября 2009

Вы не можете использовать регулярные выражения в 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]», если у вас нет чувствительности к регистру

2 голосов
/ 13 сентября 2009

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

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 '%.%'

Для получения дополнительной информации см. Функцию ISNUMERIC в MSDN.

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

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

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

2 голосов
/ 13 сентября 2009

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

например. Oracle

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

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

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