programing

'WHERE' 절 sql에서 다른 값으로 폴백하는 방법은 무엇입니까?

topblog 2023. 7. 22. 09:07
반응형

'WHERE' 절 sql에서 다른 값으로 폴백하는 방법은 무엇입니까?

열 필드1='value1'에 대한 값이 없으면 'default'에 대한 레코드를 가져와야 하는 경우가 있습니다.

위 시나리오에서는 두 가지 쿼리를 사용했습니다.

Select * from table_name where field1="value1"

위 쿼리가 레코드를 반환하지 않으면 다음 쿼리를 실행합니다.

Select * from table_name where field1="default"

이제 저는 위에 언급된 것을 하나의 질문에서 하고 싶습니다.누가 저를 도와줄 수 있을까요?나는 답이 어딘가에 있다고 믿습니다.CASE WHEN

또한 위의 쿼리는 mysql 뿐만 아니라 oracle, postgres에 대해서도 작동해야 합니다.

핵심 ANSI SQL 응답(모든 플랫폼에서 실행 예정):

select * from table_name
where field1 = 'value1'
  or (field1 = 'default'
      and NOT EXISTS (select 1 from table_name where field1 = 'value1'))

사용 사례 및 아래와 같이 존재합니다.

Select * from table_name where field1=
    case when exists(select 1  from table_name  where field1='value1')
    then 'value1' else 'default 'end

다음을 사용한 최적의 솔루션coalesce():

Select * from table_name where field1 = coalesce (
    (select field1  from table_name where field1='value1' limit 1)
    , 'default'
);

주의:limit 1하위 쿼리:이 경우 하위 선택이 두 개 이상의 행을 반환하지 않도록 해야 합니다.하지만 심지어 그것을 사용하는 것도.case when exists (...)접근하지 않으면 데이터베이스 엔진이 하위 쿼리와 일치하는 모든 행을 검색해야 하므로 이를 추가하는 것이 좋습니다.

물론, 대부분의 최신 데이터베이스는 조용히 최적화할 수 있을 정도로 충분히 똑똑합니다.하지만 몇몇 오래된 것들은 그럴 수 없었습니다.그리고 어쨌든, 그것은 그들이 할 수 없는 경우가 될 수 있습니다.

그것은, 예를 들어, Postgre에서.SQL, 하위 쿼리에서 안정적이지 않은(또는 적절하게 선언되지 않은) 함수를 사용하는 경우, 설계자는 해당 함수에 부작용이 있을 경우 일관된 결과를 생성하기 위해 전체 검색을 수행해야 합니다.

Mysql의 경우:

SET @a = Select Count(*) from table_name where field1="value1"
IF @a > 0 Then
Select 
    * 
from 
    table_name 
where 
   field1="value1"
ELSE
Select 
    * 
from 
    table_name 
where 
   field1="default"
END IF

좋아요, 제가 해봤는데 효과가 있는 것 같아요.

SELECT * FROM table_name WHERE  
CASE
  WHEN EXISTS(SELECT * FROM table_name WHERE field1='value1') THEN field1= 'value1'
  ELSE field1='default'
END

당신도 해볼 수 있어요...

select * table_name where field1="default"
and not exists (select * from table_name where field1="value1")
union all
select * from table_name where field1="value1"

사용할 수 있습니다.case와의 진술.count확인.

select *
  from table_name
 where coulmn_1 = (case
         when (select count(1) from dc_date_card where coulmn_1 = value_1) > 0 then
 value_1 
 else
  Default 
  end)

언급URL : https://stackoverflow.com/questions/38715625/how-to-fallback-to-a-different-value-in-where-clause-sql

반응형