Обнаружение случаев с помощью операторов SQL - PullRequest
2 голосов
/ 09 июня 2011

Я пытаюсь использовать команду SQL, которая просматривает блок текста и определяет наличие в нем 3 последовательных заглавных букв. Есть ли способ сделать это? Или даже проще, есть ли способ, которым SQL может обнаружить регистр?

Ответы [ 4 ]

7 голосов
/ 09 июня 2011

РЕДАКТИРОВАТЬ Вопрос был изначально помечен mysql, и это бы сработало.Он был помечен как sql-server и не подходит для MS SQL Server.

Вы можете использовать REGEXP

SELECT columnname REGEXP '[A-Z]{3}' FROM table;

Возвращает 1, где columnname соответствует.

3 голосов
/ 10 июня 2011

Функция, которую вы можете использовать

create function ThreeUpperInARow(@s varchar(max)) returns bit
begin
  declare @Rows int

  ;with cte as
  (
    select left(@s, 3) as Part,
           stuff(@s, 1, 1, '') as Rest
    union all
    select left(Rest, 3) as Part,
           stuff(Rest, 1, 1, '') as Rest
    from cte
    where len(Rest) >= 3
  )
  select @Rows = count(*)
  from cte
  where upper(Part) = Part COLLATE Latin1_General_CS_AS

  return case @Rows when 0
           then 0
           else 1
         end
end

Использование:

declare @T table(ID int identity, Txt varchar(max))
insert into @T
select 'aaaAFAaaaBB' union all
select 'aaaAAaaaBB'

select T.ID,
       T.Txt,
       dbo.ThreeUpperInARow(T.Txt) as Upp
from @T as T

Результат:

ID          Txt             Upp
----------- --------------- -----
1           aaaAFAaaaBB     1
2           aaaAAaaaBB      0
1 голос
/ 09 июня 2011

Чтобы расширить ответ Михаэля: вы можете выполнить сравнение с учетом регистра, используя эту конструкцию:

SELECT 'abc' LIKE BINARY 'ABC';  /*false*/

SELECT 'aBc' LIKE BINARY 'aBc'; /*true*/

См .: http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html
и: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

0 голосов
/ 23 июня 2011

Я успешно сравнил прописные буквы, приведя varchars как varbinary, так как прописные и строчные буквы сравниваются как равные в SQL

SELECT * FROM Table WHERE CAST (SUBSTRING (ColumnName, 1,3) как varbinary) = CAST(SUBSTRING (UPPER (ColumnName), 1,3) как varbinary)

Одна из проблем заключается в том, что если у вас есть имя, например, O'Reilly, оно вернет true.

...