SQL LIKE 문에서 변수 사용
다음과 같은 LIKE 클로스에 대한 변수를 취할 저장 프로시저(MSSQL 2k5)가 있습니다.
DECLARE @SearchLetter2 char(1)
SET @SearchLetter = 't'
SET @SearchLetter2 = @SearchLetter + '%'
SELECT *
FROM BrandNames
WHERE [Name] LIKE @SearchLetter2 and IsVisible = 1
--WHERE [Name] LIKE 't%' and IsVisible = 1
ORDER BY [Name]
안타깝게도 현재 실행 중인 줄은 구문 오류를 발생시키는 반면 주석이 달린 where 절은 정상적으로 실행됩니다.아무도 언급하지 않은 라인이 작동하도록 도와줄 수 있나요?
저장 프로시저를 사용하는 경우:
ALTER PROCEDURE <Name>
(
@PartialName VARCHAR(50) = NULL
)
SELECT Name
FROM <table>
WHERE Name LIKE '%' + @PartialName + '%'
Joel은 @Search Letter가 아직 선언되지 않았다는 것입니까?또한 @SearchLetter2의 길이가 't%'에 충분하지 않습니다.길이가 더 긴 막대 모양을 사용해 보십시오.
앤드류 브라우어의 말처럼, 하지만 트림을 추가하는 것은
ALTER PROCEDURE <Name>
(
@PartialName VARCHAR(50) = NULL
)
SELECT Name
FROM <table>
WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'
하지만 제 생각에 한 가지 중요한 것이 있습니다.
"문자(숫자)"는 변수의 길이입니다.
예를 들어 [테스트1]과 같이 "이름"이 있는 테이블이 있는 경우.Test200] 그리고 다음과 같이 SELECT에 char(5)를 선언합니다.
DECLARE @variable char(5)
SET @variable = 'Test1%'
SELECT * FROM table WHERE Name like @variable
결과는 - "테스트 1"!(문자(5) - 5자, 테스트 11은 6)만 됩니다.
[테스트11]과 같은 잠재적인 관심 데이터의 나머지.Test200]은(는) 결과에 반환되지 않습니다.
이렇게 해서 SELECT를 제한하고 싶어도 괜찮습니다.그러나 의도적인 방법이 아닐 경우 계획된 결과에서 잘못된 결과가 반환될 수 있습니다(예: "테스트 1로 시작하는 모든 이름...").
제 생각에는 선택한 값의 정확한 길이를 모르는 경우 더 나은 해결책이 다음과 같은 방법일 수 있습니다.
DECLARE @variable varchar(max)
SET @variable = 'Test1%'
SELECT * FROM <table> WHERE variable1 like @variable
이것은 반환됩니다(테스트 1 및 테스트 11).테스트 19 및 테스트 100..테스트 199).
이것은 Northwind 샘플 DB에서 사용할 수 있습니다. Search Letter에는 두 개의 문자가 있으며 Search Letter를 실행하려면 다음과 같이 선언해야 합니다.
declare @SearchLetter2 char(2)
declare @SearchLetter char(1)
Set @SearchLetter = 'A'
Set @SearchLetter2 = @SearchLetter+'%'
select * from Customers where ContactName like @SearchLetter2 and Region='WY'
선언 @검색 편지 2문자(1)
이 문자를 더 긴 문자로 설정합니다.
우리는 직접적으로 쓸 수도 있습니다...
DECLARE @SearchLetter CHAR(1)
SET @SearchLetter = 'A'
SELECT *
FROM CUSTOMERS
WHERE CONTACTNAME LIKE @SearchLetter + '%'
AND REGION = 'WY'
또는 모든 검색 문자를 추가해야 하는 경우에도 다음과 같은 방법으로.
DECLARE @SearchLetter CHAR(1)
SET @SearchLetter = 'A' + '%'
SELECT *
FROM CUSTOMERS
WHERE CONTACTNAME LIKE @SearchLetter
AND REGION = 'WY'
이 두 가지 모두 작동합니다.
LIKE에서 로컬 변수를 사용하는 것도 문제가 있었습니다.
중요한 것은 얼마나 오랫동안 변수가 되는지 아는 것입니다.
아래에서 ORDER_NO는 50자이므로 LIKE @ORDER_NO를 사용할 수 없습니다. 마지막에 공백이 있기 때문입니다.
먼저 변수의 오른쪽을 잘라야 합니다.
다음과 같이:
DECLARE @ORDER_NO char(50)
SELECT @ORDER_NO = 'OR/201910/0012%'
SELECT * FROM orders WHERE ord_no LIKE RTRIM(@ORDER_NO)
저도 비슷한 문제에 부딪혔습니다.데이터베이스에 저장된 URL 중 앞부분과 끝부분이 관련이 없는 부분만 사용해야 했습니다.
처음에는 다음을 사용하려고 했습니다.
DECLARE @variable VARCHAR(250) = %x%;
SELECT * FROM tblone WHERE column1 LIKE '@variable'
그러나 다음 오류가 반환되었습니다.
숫자를 데이터 형식 varchar로 변환하는 중 산술 오버플로 오류가 발생했습니다.
작업 쿼리 형식이 지정되었습니다.
DECLARE @variable VARCHAR(1000) = x;
SELECT * FROM tblone WHERE column1 LIKE '%'+@variable+'%'
그것은 매우 간단할 것입니다.LIKE '%%[%3]%%'
[%3]
입력 변수
SAP B19.1에서 사용할 수 있습니다.
사용할 수도 있습니다.CONCAT()
다음과 같이:
SET @variable='some_value';
SELECT * FROM table_name WHERE column_name LIKE (SELECT CONCAT('%',@variable,'%'));
언급URL : https://stackoverflow.com/questions/390362/using-variable-in-sql-like-statement
'programing' 카테고리의 다른 글
Oracle 세션과 연결 풀 간의 관계 (0) | 2023.07.13 |
---|---|
$ 또는 $elemMatch의 문 (0) | 2023.07.13 |
Firebase 전화 인증 오류:토큰이 잘못되었습니다. nativeToJ.오류 (0) | 2023.07.13 |
개체의 필드를 콘솔에 덤프하려면 어떻게 해야 합니까? (0) | 2023.07.13 |
PLSQL 기호 "=>"의 의미 (0) | 2023.07.13 |