2015-03-23 15 views
12

Mam następujący REGEX:^[- a-zA-Z0-9 /.]+$MSSQL Wyrażenie regularne

obecnie sprawdza, czy wartość ta weszła w polu tekstowym to pasuje. Jeśli nie, zgłasza błąd.

Muszę sprawdzić, czy coś już poszło do bazy danych, które nie pasuje do tego.

mam zmęczony:

SELECT * FROM *table* WHERE ([url] NOT LIKE '^[-A-Za-z0-9/.]+$') 
SELECT * FROM *table* WHERE PATINDEX ('^[-A-Za-z0-9/.]+$', [url]) 

UPDATE

Więc po trochę badań zdałem sobie sprawę, że nie sądzę, mogę używać REGEXP.

Myślałem, że mogę zrobić coś takiego? Nie daje mi oczekiwanych rezultatów, ale działa inaczej niż cokolwiek innego. Czy ktoś może coś z tym zrobić?

SELECT *, 
    CASE WHEN [url] LIKE '^[-A-Za-z0-9/.]+$' 
    THEN 'Match' 
    ELSE 'No Match' 
    END Validates 
FROM 
    *table* 
+1

używasz MSSQL lub MySQL? Są to dwa, różne, konkurencyjne produkty RDBMS od różnych dostawców, które mają różną składnię. – eggyal

Odpowiedz

14

Dziękuję wszystkim za pomoc.

To właśnie użyłem w końcu:

SELECT *, 
    CASE WHEN [url] NOT LIKE '%[^-A-Za-z0-9/.+$]%' 
    THEN 'Valid' 
    ELSE 'No valid' 
    END [Validate] 
FROM 
    *table* 
    ORDER BY [Validate] 
+4

Jestem pewien, że odpowiedź nie działa zgodnie z przeznaczeniem, ponieważ MS-SQL obsługuje tylko bardzo ograniczony podzbiór operatorów podobnych do RegExp: https://msdn.microsoft.com/en-us/library/ms187489(v=sql. 105) .aspx, stąd wyrażenie podane w [] pasuje do pojedynczego znaku z zestawu^-A-Za-z0-9 /.+$, a reszta jest zużywana przez%, który będzie pasował do dowolnego ciągu w wyrażeniu LIKE. –

+0

@ Mr.Napik - Pomysł jest dźwiękowy, ale zależy od sortowania, niezależnie od tego, czy faktycznie działa w formie pisemnej. '^' działa jako negacja. Zamiast więc mówić "sprawdź każdy znak pasuje do wzorca", sprawdza, czy nie ma znaków, które nie pasują do wzorca. Prawdopodobnie potrzebuje binarnej klauzuli collate, aby rzeczywiście działać zgodnie z zamierzeniami. na przykład zobacz 'WYBIERZ char (number) FROM master..spt_values ​​WHERE typ = 'P' i numer między 1 a 255 oraz CHAR (liczba) NIE LIKE '[^ -A-Za-z0-9 /.+$]' COLLATE Latin1_General_Bin 'zi bez niego. –

12

Zastrzeżenie: Oryginalny pytanie było o MySQL. Odpowiedź serwera SQL znajduje się poniżej.

MySQL

W MySQL składnia regex jest następujący:

SELECT * FROM YourTable WHERE (`url` NOT REGEXP '^[-A-Za-z0-9/.]+$') 

pomocą punkt zamiast LIKEREGEXP. Ta ostatnia służy do dopasowywania wzorców przy użyciu symboli wieloznacznych o numerach % i _.


SQL Server

Ponieważ popełnił literówkę, a używasz SQL Server (nie MySQL), musisz utworzyć funkcję CLR zdefiniowane przez użytkownika, aby odsłonić funkcje regex.

Aby uzyskać więcej informacji, zobacz this article.

+0

Otrzymuję wyrażenie o charakterze nie-boolowskim określone w kontekście, w którym oczekiwany jest warunek "Czy muszę odwoływać się do czegokolwiek innego? –

+0

Hmm, myślę, że to może być związane z komentarzem do Filogenezy ... Nie używaj "[...]", aby uciec od nazw kolumn, to jest składnia T-SQL. Albo upuść je, jeśli będzie to możliwe, albo użyj backticks (') –

+0

Zmieniłem go na powyższy kod. Otrzymuję teraz: Niepoprawna składnia w pobliżu "REGEX". oczekiwanie pomiędzy lub w. Mam googleed to i wydaje się, że jego błąd typu cast? –

0

Zastosowanie REGEXP nie LIKE:

SELECT * FROM `table` WHERE ([url] NOT REGEXP '^[-A-Za-z0-9/.]+$') 
+0

Co to jest "REGEXP"? Nie mogę znaleźć żadnych informacji na ten temat ... – Azimuth

+0

@Azimuth Informacje o wyrażeniach regularnych na serwerze SQL można znaleźć tutaj: https://docs.microsoft.com/en-us/sql/relational-databases/scripting/search-text-with -regular-expressions – Matt

+0

@Matt Podany link odnosi się do __editing__ zapytania, a nie poprawnej składni SQL Server. Co ważniejsze, nawet w SQL Server 2017 z uruchomioną podobną zapytaniem zwraca 'Wyrażenie typu nie-boolowskiego określone w kontekście, w którym oczekiwany jest warunek, w pobliżu błędu" REGEXP ". - Zakładam, że nie ma jeszcze takiego słowa kluczowego. – bjauy