Sql Only String поиск - PullRequest
       1

Sql Only String поиск

0 голосов
/ 05 июня 2018
with temp(name) as (select 'abc' from dual
union select '123abc' from dual
union select '1abc3' from dual)
select * from temp where temp.name  like '%[a-z]%'

почему я не могу получить все 3 записи в выводе, я использую Oracle SQL Developer 11g

Причина, по которой я использую этот запрос: я хочу проверить, содержит ли столбец "Желаемый"только строка без номера и специального символа

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Fist, лучше использовать union all, а не union, потому что union требует дополнительных затрат на удаление дубликатов.

Во-вторых, ваш шаблон like нестандартный, поддерживается только вSQL Server и Sybase.Другими словами, ни одно из ваших имен не содержит квадратных скобок или дефисов, поэтому ни одно из них не соответствует шаблону.

Делает ли это то, что вы ожидаете?

with temp(name) as (
      select 'abc' from dual union all
      select '123abc' from dual union all
      select '1abc3' from dual
     )
select *
from temp
where temp.name like '%a%';

Это только проверка синтаксиса.Это не эквивалентно вашему like шаблону.

Я предполагаю из синтаксиса, что вы используете Oracle.Если это так, то вы можете использовать регулярные выражения:

where regexp_like(temp.name, '[a-z]')

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

0 голосов
/ 05 июня 2018

Прежде всего, вы смешиваете понятия.Вы пытаетесь сравнить регулярное выражение, используя обычный оператор LIKE.Во-вторых, вы должны пометить свой вопрос с базой данных, которую вы используете.Я предполагаю, что вы используете oracle, учитывая таблицу dual.

WITH temp(name) AS (SELECT 'abc' FROM dual
    UNION SELECT '123abc' FROM dual
    UNION SELECT '1abc3' FROM dual)
SELECT * FROM temp 
WHERE REGEXP_LIKE(temp.name,'[a-z]+')

Также обратите внимание, что использование подстановочного знака % не будет работать так, как вы ожидаете в совпадении с регулярным выражением.

0 голосов
/ 05 июня 2018

Вы смешиваете синтаксис SQL Server и Oracle:

Демонстрация SQL SERVER :

with temp(name) as (
      select 'abc' union all select '123abc'  union select '1abc3' 
)
select * from temp where temp.name like '%[a-z]%';
                                        -- [] is T-SQL specific

ORACLEДемоверсия :

with temp(name) as (select 'abc' from dual
union select '123abc' from dual
union select '1abc3' from dual)
select * from temp where regexp_like(temp.name, '[a-z]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...