Можно ли использовать выражение «Где» в SQL, чтобы показывать только поле, содержащее только буквы и цифры? - PullRequest
3 голосов
/ 26 августа 2011

Я хочу иметь возможность выбрать только поле, в котором определенное поле содержит как буквы, так и цифры. например:

Select [field1], [field2] 

from [db1].[table1] 

where [field2] = *LETTERS AND NUMBERS*

Я использую SQL Server 2005, также я извиняюсь, но я не уверен на сто процентов в типе данных поля, поскольку он находится на связанном сервере и недоступен в данный момент. Надеюсь, что вы можете помочь

:)

Ответы [ 5 ]

9 голосов
/ 26 августа 2011

, как сделает это. Это двойной отрицательный

where [field2] NOT LIKE '%[^0-9a-z]%'

Там написано:

  • %[^0-9a-z]% означает not (alphanumeric)
  • NOT LIKE '%[^0-9a-z]%' означает not(not(alphanumeric)) -> буквенно-цифровой

Edit:

Для всех чисел ... "это работает"

SELECT 'it works' WHERE '1234567' NOT LIKE '%[^0-9a-z]%'

Все буквы

SELECT 'it works' WHERE 'abcdefg' NOT LIKE '%[^0-9a-z]%'

Содержит не алфавитно-цифровую

SELECT 'it works' WHERE 'abc_123' NOT LIKE '%[^0-9a-z]%'

Редактировать 2:

Это решение для

только буквенно-цифровые символы, любая комбинация букв и цифр

Редактировать 3:

буквы, за которыми следуют цифры

where [field2] NOT LIKE '%[^0-9a-z]%' AND [field2] LIKE '[a-z]%[0-9]'

Edit:

Наконец, 2 буквы и до 3 цифр

where
   [field2] LIKE '[a-z][a-z][0-9]'
   OR
   [field2] LIKE '[a-z][a-z][0-9][0-9]'
   OR
   [field2] LIKE '[a-z][a-z][0-9][0-9][0-9]'
2 голосов
/ 26 августа 2011

Если вам нужно, чтобы в нем содержались как цифры, так и буквы, и никаких других символов, я думаю, что вы должны использовать 3 одинаковых предложения.Один NOT LIKE, как сказал @gbn, затем 2 LIKE с, чтобы обеспечить представление обоих классов символов:

select * from (select '123' union all select 'abc' union all select 'a2') t(Field)
where Field LIKE '%[0-9]%' and Field like '%[a-z]%'
AND Field NOT LIKE '%[^0-9a-z]%'

возвращает одну строку с 'a2'.


Если это должны быть только буквы, за которыми следуют цифры, я думаю, что вы могли бы достичь этого с еще одним, не похожим, снова вдохновленным @gbn:

NOT LIKE '%[0-9]%[a-z]%'

Но это начинает выглядеть такпредпочтительным маршрутом может быть регулярное выражение в CLR.

2 голосов
/ 26 августа 2011

То, что вы хотели бы сделать, это сопоставление регулярных выражений на основе SQL. Проверьте это: http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

Котировки:

"Хотя T-SQL является чрезвычайно мощным средством для обработки большинства данных, он мало поддерживает анализ текста или манипулирование им. Попытка выполнить любой сложный анализ текста с использованием встроенных строковых функций приводит к очень большим функциям и хранимым процедурам, которые трудно отлаживать и поддерживать. "

И

"Однако есть SQLCLR, пользовательская функция CLR (UDF), которая позволяет создавать эффективный и менее подверженный ошибкам набор функций с использованием Microsoft® .NET Framework."

Тогда вы получите примеры кода. Разве Microsoft не великолепна? : D

1 голос
/ 26 августа 2011

Я верю, что PATINDEX поможет вам.Приведенный ниже запрос проверяет наличие символов, отличных от 0-9 и не az, и возвращает 0, если он не находит (т. Е. Только # и буквы)

Select [field1], [field2] 
from [db1].[table1] 
where patindex('%[^0-9a-z]%', [field2]) = 0
0 голосов
/ 26 августа 2011
Select [field1], [field2] 

from [db1].[table1] 

where [field2] REGEXP '^[0-9a-fA-F]*$'
...