मेरे पास निम्न परीक्षण उपयोग केस है जो ठीक काम कर रहा है:

WITH t1 AS (
  SELECT 1 as id
  UNION ALL
  SELECT NULL
  UNION ALL
  SELECT 2
)

Select 
  *,
  case when id is null then "null" when id = 1 then "test" end
from 
  t1

मेरी असली क्वेरी पर मेरे पास date_diff फ़ंक्शन है:

DATE_DIFF(second_date,first_date, DAY) as time_lag,

और निम्नलिखित केस स्टेटमेंट को लागू करने का प्रयास करते समय:

case when time_lag is null then "null" when time_lag = "1" then "test" end

मेरे पास यह त्रुटि है:

No matching signature for operator = for argument types: STRUCT<client_ID STRING, Total INT64, first_date DATE, ...>, STRING. Supported signatures: ANY = ANY at [79:49]

मैं समझता हूं कि DATE_DIFF कथन INT64 और कुछ शून्य मान लौटा रहा है क्योंकि सभी पंक्तियों में दिनांक नहीं है। मुझे समझ में नहीं आता कि मेरा परीक्षण उपयोग मामला मेरे वास्तविक उपयोग के मामले से कैसे भिन्न है। और मेरे वास्तविक उपयोग के मामले में क्या गलत है ...

0
Simon Breton 12 जून 2020, 21:45
1
क्या आपने कोशिश की है "केस जब DATE_DIFF (सेकेंड_डेट, फर्स्ट_डेट, डे) शून्य है, तब शून्य है जब DATE_DIFF (सेकंड_डेट, फर्स्ट_डेट, डे) = 1 फिर 'टेस्ट' एंड"।
 – 
VarunT
12 जून 2020, 21:52
हाँ यह काम कर रहा है... मुझे समझ नहीं आता क्यों लेकिन यह काम कर रहा है....
 – 
Simon Breton
12 जून 2020, 21:57

2 जवाब

तुम्हें कोशिश करनी चाहिए

case when time_lag is null then "null" when time_lag = 1 then "test" end    

जैसा कि आपने कहा - time_lag INT64 है इसलिए समस्या ... when time_lag = "1" then ... में है/थी

0
Mikhail Berlyant 12 जून 2020, 21:55
वही त्रुटि No matching signature for operator = for argument types: STRUCT<client_ID STRING, Total INT64, first_date DATE, ...>, INT64. Supported signatures: ANY = ANY at [83:49]
 – 
Simon Breton
12 जून 2020, 21:58
तो आपको अपने वास्तविक प्रश्न के साथ अपना प्रश्न अपडेट करना चाहिए ताकि हम आपकी मदद कर सकें !!
 – 
Mikhail Berlyant
12 जून 2020, 22:00
मैं कर रहा हूँ। यह बहुत बड़ी क्वेरी है।
 – 
Simon Breton
12 जून 2020, 22:08

मेरी टिप्पणी के आगे, आप डेटाबेस तालिका में एक कॉलम के रूप में time_lag का इलाज कर रहे हैं जो मुझे लगता है, ऐसा नहीं है। यह 2 कॉलम से परिकलित मान है। तो आपके पास 2 विकल्प हैं - या तो एक सबक्वेरी का उपयोग करें जो DATE_DIFF ऑपरेशन करता है और फिर इसे टाइम_लैग के रूप में उपनाम देता है। या सीधे केस एक्सप्रेशन में गणना का उपयोग करें।

 CASE WHEN DATE_DIFF(second_date,first_date, DAY) is null THEN null WHEN DATE_DIFF(second_date,first_date, DAY) = 1 then 'Test' end
0
VarunT 12 जून 2020, 22:09
मैं एक उप-क्वेरी का उपयोग कर रहा हूं। जो मुझे समझ में नहीं आता है कि यह मुख्य क्वेरी पर क्यों काम कर रहा है और उप-क्वेरी में परिणाम पर लागू होने पर काम नहीं कर रहा है।
 – 
Simon Breton
12 जून 2020, 22:11
खैर, मुझे यह देखना होगा कि आप किस उप-क्वेरी का उपयोग कर रहे हैं।
 – 
VarunT
12 जून 2020, 22:12
हां। यह बहुत बड़ी क्वेरी का हिस्सा है इसलिए मैं यह देखने की कोशिश कर रहा हूं कि मैं इसे यहां कैसे साझा कर सकता हूं।
 – 
Simon Breton
12 जून 2020, 22:18